|
{"version":3,"file":"main.js","sources":["../module/ShaderUtils.js","../module/DicePreset.js","../module/DiceDefaultPresets.js","../module/DiceColors.js","../module/DiceModels.js","../node_modules/three/build/three.module.js","../node_modules/three/examples/jsm/utils/BufferGeometryUtils.js","../node_modules/three/examples/jsm/loaders/GLTFLoader.js","../module/DiceFactory.js","../module/DiceSFX.js","../module/sfx/PlaySoundEpicFail.js","../module/sfx/PlaySoundEpicWin.js","../module/libs/three.proton.js","../module/sfx/PlayAnimationParticleSpiral.js","../module/sfx/PlayAnimationParticleSparkles.js","../module/sfx/PlayAnimationParticleVortex.js","../module/sfx/PlayAnimationBright.js","../module/sfx/PlayAnimationDark.js","../module/sfx/PlayAnimationThormund.js","../module/sfx/PlayAnimationImpact.js","../module/DiceSFXManager.js","../module/sfx/PlayAnimationOutline.js","../module/sfx/PlayConfettiStrength1.js","../module/sfx/PlayConfettiStrength2.js","../module/sfx/PlayConfettiStrength3.js","../module/sfx/PlaySoundCustom.js","../module/sfx/PlayMacro.js","../node_modules/three/examples/jsm/loaders/RGBELoader.js","../node_modules/three/examples/jsm/shaders/CopyShader.js","../node_modules/three/examples/jsm/postprocessing/Pass.js","../node_modules/three/examples/jsm/postprocessing/ShaderPass.js","../node_modules/three/examples/jsm/postprocessing/MaskPass.js","../node_modules/three/examples/jsm/postprocessing/EffectComposer.js","../node_modules/three/examples/jsm/postprocessing/RenderPass.js","../node_modules/three/examples/jsm/postprocessing/OutlinePass.js","../node_modules/three/examples/jsm/shaders/SMAAShader.js","../module/libs/SMAAPass.js","../node_modules/three/examples/jsm/shaders/GammaCorrectionShader.js","../node_modules/three/examples/jsm/shaders/LuminosityHighPassShader.js","../module/libs/TransparentUnrealBloomPass.js","../module/DiceBox.js","../module/DiceNotation.js","../module/Accumulator.js","../module/Utils.js","../module/libs/ThinFilmFresnelMap.js","../module/tours/DiceTour.js","../module/tours/DiceTourMain.js","../module/Dice3D.js","../module/DiceConfig.js","../module/RollableAreaConfig.js","../module/main.js"],"sourcesContent":["/**\n * This class contains utility functions for working with shaders.\n * These functions are called during the onBeforeCompile event.\n * @class ShaderUtils\n */\nexport class ShaderUtils {\n\n\tstatic applyDiceSoNiceShader(shader) {\n\n\t\tif(this.emissive !== undefined && game.dice3d.DiceFactory.realisticLighting) {\n\t\t\tShaderUtils.selectiveBloomShaderFragment(shader);\n\t\t}\n\n\t\t// This is the old iridescent shader, which is now deprecated.\n\t\tif (this.userData.iridescent) {\n\t\t\tShaderUtils.iridescentShaderFragment(shader);\n\t\t}\n\n\t\tif (shader.shaderName == \"MeshPhysicalMaterial\" && shader.transmission) {\n\t\t\tShaderUtils.transmissionAlphaShaderFragment(shader);\n\t\t}\n\n\t\tif (shader.shaderName == \"MeshPhysicalMaterial\" && shader.iridescence) {\n\t\t\tShaderUtils.iridescenceShaderFragment(shader);\n\t\t}\n\t}\n\n\tstatic transmissionAlphaShaderFragment(shader) {\n\t\tshader.fragmentShader = shader.fragmentShader.replace(`#include <transmission_fragment>`,\n\t\t\t`#include <transmission_fragment>\n\t\t\ttotalDiffuse = mix( totalDiffuse, transmission.rgb, transmissionFactor);\n\t\t\tfloat grey = (material.diffuseColor.r + material.diffuseColor.g + material.diffuseColor.b) / 3.0;\n\t\t\ttransmissionAlpha = mix( transmissionAlpha, 1.0-grey, transmissionFactor );`);\n\t}\n\n\tstatic selectiveBloomShaderFragment(shader) {\n\t\tshader.uniforms.globalBloom = game.dice3d.uniforms.globalBloom;\n\t\tshader.fragmentShader = `\n\t\t\tuniform float globalBloom;\n\t\t\t${shader.fragmentShader}\n\t\t`.replace(\n\t\t\t`#include <dithering_fragment>`,\n\t\t\t`#include <dithering_fragment>\n\t\t\tif (globalBloom > 0.5) {\n\t\t\t\t#ifdef USE_EMISSIVEMAP\n\t\t\t\t\tgl_FragColor.rgb = texture2D( emissiveMap, vMapUv ).rgb * emissive;\n\t\t\t\t#else\n\t\t\t\t\tgl_FragColor.rgb = vec3(0.0);\n\t\t\t\t#endif\n\t\t\t}\n\t\t`\n\t\t);\n\t}\n\n\tstatic iridescenceShaderFragment(shader) {\n\t\t// We only need to change the color channel used by the ThreeJS shader for the iridescenceMap from red to blue.\n\t\t// This is because we want to use the metallic channel for the iridescenceMap.\n\t\tshader.fragmentShader = shader.fragmentShader.replace(`#include <lights_physical_fragment>`,\n\t\t\t`#include <lights_physical_fragment>\n\t\t\t\t#ifdef USE_IRIDESCENCE\n\t\t\t\t\tmaterial.iridescence = iridescence;\n\t\t\t\t\t#ifdef USE_IRIDESCENCEMAP\n\t\t\t\t\t\tmaterial.iridescence *= texture2D( iridescenceMap, vUv ).b;\n\t\t\t\t\t#endif\n\t\t\t\t#endif`);\n\t}\n\t// This is the old iridescent shader, which is now deprecated.\n\tstatic iridescentShaderFragment(shader) {\n\t\tshader.uniforms.iridescenceLookUp = game.dice3d.uniforms.iridescenceLookUp;\n\t\tshader.uniforms.iridescenceNoise = game.dice3d.uniforms.iridescenceNoise;\n\t\tshader.uniforms.boost = game.dice3d.uniforms.boost;\n\n\t\tshader.vertexShader = `\n\t\t\tvarying vec3 viWorldPosition;\n\t\t\tvarying vec3 viWorldNormal;\n\t\t\t${shader.vertexShader}\n\t\t`.replace(\n\t\t\t`#include <fog_vertex>`,\n\t\t\t`#include <fog_vertex>\n\t\t\tviWorldPosition = worldPosition.xyz;\n\t\t\tviWorldNormal = mat3(modelMatrix) * normalize(normal);\n\t\t\t`\n\t\t);\n\n\t\tshader.fragmentShader = `\n\t\t\tvarying vec3 viWorldPosition;\n\t\t\tvarying vec3 viWorldNormal;\n\t\t\t\n\t\t\tuniform sampler2D iridescenceLookUp;\n\t\t\tuniform sampler2D iridescenceNoise;\n\t\t\tuniform float boost;\n\t\t\t${shader.fragmentShader}\n\t\t`.replace(\n\t\t\t`#include <transmission_fragment>`,\n\t\t\t`vec3 viewWorldDir = normalize(viWorldPosition - cameraPosition);\n\t\t\tvec3 iNormal = normalize(viWorldNormal); \n\t\t\tfloat NdotV = max(-dot(viewWorldDir, iNormal), 0.0);\n\t\t\tfloat fresnelFactor = pow(1.0 - NdotV, 5.0);\n\t\t\tfloat noise = texture2D(iridescenceNoise, vUv/2.0).r;\n\t\t\tvec3 airy = texture2D(iridescenceLookUp, vec2(NdotV * .99, noise)).xyz;\n\t\t\t\n\t\t\tif(metalnessFactor >= 1.0) {\n\t\t\t\ttotalSpecular = totalSpecular * airy * boost;\n\t\t\t}\n\n\t\t\t#include <transmission_fragment>`\n\t\t);\n\t}\n}","import { ShaderUtils } from './ShaderUtils';\nexport class DicePreset {\n\n\tconstructor(type, shape = '') {\n\n\t\tshape = shape || type;\n\n\t\tthis.type = type;\n\t\tthis.term = 'Die';\n\t\tthis.shape = shape || type;\n\t\tthis.scale = 1;\n\t\tthis.labels = [];\n\t\tthis.valueMap = null;\n\t\tthis.values = [];\n\t\tthis.bumps = [];\n\t\tthis.emissiveMaps = [];\n\t\tthis.emissive = 0x000000;\n\t\tthis.mass = 300;\n\t\tthis.inertia = 13;\n\t\tthis.geometry = null;\n\t\tthis.model = null;\n\t\tthis.system = 'standard';\n\t\tthis.modelLoaded = false;\n\t\tthis.modelLoading = false;\n\t\tthis.modelFile = null;\n\t\tthis.internalAdd = false;\n\n\t\t//todo : check if this is useful\n\t\tthis.appearance = {\n\t\t\tlabelColor: \"#FFFFFF\",\n\t\t\tdiceColor: \"#000000\",\n\t\t\toutlineColor: \"#000000\",\n\t\t\tedgeColor: \"#000000\",\n\t\t\ttexture: \"none\",\n\t\t\tmaterial: \"auto\",\n\t\t\tfont: \"auto\",\n\t\t\tcolorset: \"custom\"\n\t\t};\n\t}\n\n\tsetValues(min = 1, max = 20, step = 1) {\n\t\tthis.values = this.range(min, max, step);\n\t\tif(min < 1)\n\t\t\tthis.setValueMap(min, max, step);\n\t}\n\n\tsetValueMap(min, max, step) {\n\t\tlet map = {};\n\t\tlet count=1;\n\t\tfor(let i = min; i<= max; i+=step){\n\t\t\tmap[i] = count;\n\t\t\tcount++;\n\t\t}\n\t\tthis.valueMap = map;\n\t}\n\n\tregisterFaces(faces, type = \"labels\") {\n\t\tlet tab = [];\n\t\t\n\t\ttab.push('');\n\t\tif (![\"d2\", \"d10\"].includes(this.shape)) tab.push('');\n\n\t\tif (this.shape == 'd4') {\n\n\t\t\tlet a = faces[0];\n\t\t\tlet b = faces[1];\n\t\t\tlet c = faces[2];\n\t\t\tlet d = faces[3];\n\n\t\t\ttab = [\n\t\t\t\t[[], [0, 0, 0], [b, d, c], [a, c, d], [b, a, d], [a, b, c]],\n\t\t\t\t[[], [0, 0, 0], [b, c, d], [c, a, d], [b, d, a], [c, b, a]],\n\t\t\t\t[[], [0, 0, 0], [d, c, b], [c, d, a], [d, b, a], [c, a, b]],\n\t\t\t\t[[], [0, 0, 0], [d, b, c], [a, d, c], [d, a, b], [a, c, b]]\n\t\t\t];\n\t\t} else {\n\t\t\tArray.prototype.push.apply(tab, faces)\n\t\t}\n\n\t\tswitch(type){\n\t\t\tcase \"labels\":\n\t\t\t\tthis.labels = tab;\n\t\t\t\tbreak;\n\t\t\tcase \"bumps\":\n\t\t\t\tthis.bumps = tab;\n\t\t\t\tbreak;\n\t\t\tcase \"emissive\":\n\t\t\t\tthis.emissiveMaps = tab;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tsetLabels(labels) {\n\t\tthis.labels = labels;\n\t\tthis.modelLoaded=false;\n\t\tthis.modelLoading=false;\n\t}\n\n\tsetBumpMaps(bumps) {\n\t\tthis.bumps = bumps;\n\t\tthis.modelLoaded=false;\n\t\tthis.modelLoading=false;\n\t}\n\n\tsetEmissiveMaps(emissiveMaps) {\n\t\tthis.emissiveMaps = emissiveMaps;\n\t\tthis.modelLoaded=false;\n\t\tthis.modelLoading=false;\n\t}\n\n\tloadTextures() {\n\t\tif(!this.modelLoaded && this.modelLoading === false){\n\t\t\tthis.modelLoading = new Promise((resolve,reject)=> {\n\t\t\t\tlet textures;\n\t\t\t\tlet type;\n\t\t\t\tlet textureTypeLoaded = 0;\n\t\t\t\tfor(let i = 0; i < 3;i++){\n\t\t\t\t\tswitch(i){\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\ttextures = this.labels;\n\t\t\t\t\t\t\ttype = \"labels\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\ttextures = this.bumps;\n\t\t\t\t\t\t\ttype = \"bumps\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\ttextures = this.emissiveMaps;\n\t\t\t\t\t\t\ttype = \"emissive\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tlet loadedImages = 0;\n\t\t\t\t\tlet numImages = textures.length;\n\t\t\t\t\tlet regexTexture = /\\.(PNG|JPG|GIF|WEBP)$/i;\n\t\t\t\t\tlet imgElements = Array(textures.length);\n\t\t\t\t\tlet hasTextures = false;\n\t\t\t\t\tfor (let i = 0; i < numImages; i++) {\n\t\t\t\t\t\tif (textures[i] == null || textures[i] == '' || !textures[i].match(regexTexture)) {\n\t\t\t\t\t\t\timgElements[i] = textures[i];\n\t\t\t\t\t\t\t++loadedImages\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\thasTextures = true;\n\t\t\t\t\t\timgElements[i] = new Image();\n\t\t\t\t\t\timgElements[i].crossOrigin = \"Anonymous\";\n\t\t\t\t\t\timgElements.textureType = type;\n\t\t\t\t\t\timgElements[i].onload = function(){\n\t\t\t\t\t\t\tif (++loadedImages >= numImages) {\n\t\t\t\t\t\t\t\tthis.registerFaces(imgElements, imgElements.textureType);\n\t\t\t\t\t\t\t\tif(textureTypeLoaded < 2)\n\t\t\t\t\t\t\t\t\ttextureTypeLoaded++;\n\t\t\t\t\t\t\t\telse{\n\t\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t\t\tthis.modelLoaded = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}.bind(this);\n\n\t\t\t\t\t\t//We still consider the image as loaded even if it fails to load\n\t\t\t\t\t\t//so that we can still initialize the module\n\t\t\t\t\t\timgElements[i].onerror = function(texture){\n\t\t\t\t\t\t\tconsole.error(\"[Dice So Nice] Error loading texture:\" + texture);\n\t\t\t\t\t\t\tif (++loadedImages >= numImages) {\n\t\t\t\t\t\t\t\tif(textureTypeLoaded < 2)\n\t\t\t\t\t\t\t\t\ttextureTypeLoaded++;\n\t\t\t\t\t\t\t\telse{\n\t\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t\t\tthis.modelLoaded = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}.bind(this, textures[i]);\n\n\t\t\t\t\t\timgElements[i].src = textures[i];\n\t\t\t\t\t}\n\t\t\t\t\tif (!hasTextures){\n\t\t\t\t\t\tthis.registerFaces(imgElements, type);\n\t\t\t\t\t\tif(textureTypeLoaded < 2)\n\t\t\t\t\t\t\ttextureTypeLoaded++;\n\t\t\t\t\t\telse{\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\tthis.modelLoaded = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn this.modelLoading;\n\t}\n\n\trange(start, stop, step = 1) {\n\t\tvar a = [start], b = start;\n\t\twhile (b < stop) {\n\t\t\ta.push(b += step || 1);\n\t\t}\n\t\treturn a;\n\t}\n\n\tsetModel(file) {\n\t\tthis.modelFile = file;\n\t\tthis.modelLoaded = false;\n\t}\n\n\tloadModel(loader = null) {\n\t\t// Load a glTF resource\n\t\tif(!this.modelLoaded && this.modelLoading === false){\n\t\t\tthis.modelLoading = new Promise((resolve,reject)=> {\n\t\t\t\tloader.load(this.modelFile, gltf => {\n\t\t\t\t\tgltf.scene.traverse(function (node) {\n\t\t\t\t\t\tif (node.isMesh) {\n\t\t\t\t\t\t\tnode.castShadow = true; \n\t\t\t\t\t\t\tnode.material.onBeforeCompile = ShaderUtils.applyDiceSoNiceShader;\n\t\t\t\t\t\t\tconst anisotropy = game.dice3d.box.anisotropy;\n\t\t\t\t\t\t\tif(node.material.map !== null)\n\t\t\t\t\t\t\t\tnode.material.map.anisotropy = anisotropy;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(node.material.normalMap !== null)\n\t\t\t\t\t\t\t\tnode.material.normalMap.anisotropy = anisotropy;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(node.material.emissiveMap !== null)\n\t\t\t\t\t\t\t\tnode.material.emissiveMap.anisotropy = anisotropy;\n\n\t\t\t\t\t\t\tif(node.material.roughnessMap !== null)\n\t\t\t\t\t\t\t\tnode.material.roughnessMap.anisotropy = anisotropy;\n\n\t\t\t\t\t\t\tif(node.material.metalnessMap !== null)\n\t\t\t\t\t\t\t\tnode.material.metalnessMap.anisotropy = anisotropy;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tthis.model = gltf;\n\t\t\t\t\tthis.modelLoaded = true;\n\t\t\t\t\tHooks.callAll(\"diceSoNiceModelLoaded\", this);\n\t\t\t\t\tresolve(gltf);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\treturn this.modelLoading;\n\t}\n}","\nimport { DicePreset } from './DicePreset.js';\n\nexport const BASE_PRESETS_LIST = [];\nexport const EXTRA_PRESETS_LIST = [];\n\n\n//////////////////////////////////////////////////\n// BASE SYSTEM //\n//////////////////////////////////////////////////\nlet diceobj;\n\ndiceobj = new DicePreset('d2');\ndiceobj.setLabels(['1', '2']);\ndiceobj.setValues(1, 2);\ndiceobj.inertia = 8;\ndiceobj.mass = 400;\ndiceobj.scale = 0.9;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('dc', 'd2');\ndiceobj.term = 'Coin';\ndiceobj.setLabels([\n 'modules/dice-so-nice/textures/coin/tail.webp',\n 'modules/dice-so-nice/textures/coin/heads.webp'\n]);\ndiceobj.setBumpMaps([\n 'modules/dice-so-nice/textures/coin/tail_bump.webp',\n 'modules/dice-so-nice/textures/coin/heads_bump.webp'\n]);\ndiceobj.setValues(0, 1);\ndiceobj.inertia = 8;\ndiceobj.scale = 0.9;\ndiceobj.colorset = \"coin_default\"\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d4');\ndiceobj.setLabels(['1', '2', '3', '4']);\ndiceobj.setValues(1, 4);\ndiceobj.inertia = 5;\ndiceobj.scale = 1.2;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d6');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6']);\ndiceobj.setValues(1, 6);\ndiceobj.scale = 0.9;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d3', 'd6');\ndiceobj.setLabels(['1', '2', '3']);\ndiceobj.setValues(1, 3);\ndiceobj.scale = 0.9;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('df', 'd6');\ndiceobj.term = 'FateDie';\ndiceobj.setLabels(['−', ' ', '+']);\ndiceobj.setValues(-1, 1);\ndiceobj.scale = 0.9;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d8');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7', '8']);\ndiceobj.setValues(1, 8);\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d10');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']);\ndiceobj.setValues(1, 10);\ndiceobj.mass = 450;\ndiceobj.inertia = 9;\ndiceobj.scale = 0.9;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d5', 'd10');\ndiceobj.setLabels(['1', '2', '3', '4', '5']);\ndiceobj.setValues(1, 5);\ndiceobj.mass = 450;\ndiceobj.inertia = 9;\ndiceobj.scale = 0.9;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d100', 'd10');\ndiceobj.setLabels(['10', '20', '30', '40', '50', '60', '70', '80', '90', '00']);\ndiceobj.setValues(10, 100, 10);\ndiceobj.mass = 450;\ndiceobj.inertia = 9;\ndiceobj.scale = 0.9;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d12');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']);\ndiceobj.setValues(1, 12);\ndiceobj.mass = 450;\ndiceobj.inertia = 8;\ndiceobj.scale = 0.9;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d14');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14']);\ndiceobj.setValues(1, 14);\ndiceobj.mass = 450;\ndiceobj.inertia = 8;\ndiceobj.scale = 1;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d7', 'd14');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7']);\ndiceobj.setValues(1, 7);\ndiceobj.mass = 450;\ndiceobj.inertia = 8;\ndiceobj.scale = 1;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d16');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16']);\ndiceobj.setValues(1, 16);\ndiceobj.mass = 450;\ndiceobj.inertia = 8;\ndiceobj.scale = 1;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d20');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20']);\ndiceobj.setValues(1, 20);\ndiceobj.mass = 500;\ndiceobj.scale = 1;\ndiceobj.inertia = 6;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d24');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24']);\ndiceobj.setValues(1, 24);\ndiceobj.mass = 500;\ndiceobj.scale = 1;\ndiceobj.inertia = 10;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d30');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30']);\ndiceobj.setValues(1, 30);\ndiceobj.mass = 500;\ndiceobj.scale = 1;\ndiceobj.inertia = 10;\nBASE_PRESETS_LIST.push(diceobj);\n\n//////////////////////////////////////////////////\n// EXTRA SYSTEM //\n//////////////////////////////////////////////////\n\n/**\n * Dot System\n */\nEXTRA_PRESETS_LIST.push({\n type: \"d6\",\n labels: [\n 'modules/dice-so-nice/textures/dot/d6-1.webp',\n 'modules/dice-so-nice/textures/dot/d6-2.webp',\n 'modules/dice-so-nice/textures/dot/d6-3.webp',\n 'modules/dice-so-nice/textures/dot/d6-4.webp',\n 'modules/dice-so-nice/textures/dot/d6-5.webp',\n 'modules/dice-so-nice/textures/dot/d6-6.webp'\n ],\n bumpMaps: [\n 'modules/dice-so-nice/textures/dot/d6-1-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-2-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-3-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-4-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-5-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-6-b.webp'\n ],\n system: \"dot\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d6\",\n labels: [\n 'modules/dice-so-nice/textures/dot/d6-1-black.webp',\n 'modules/dice-so-nice/textures/dot/d6-2-black.webp',\n 'modules/dice-so-nice/textures/dot/d6-3-black.webp',\n 'modules/dice-so-nice/textures/dot/d6-4-black.webp',\n 'modules/dice-so-nice/textures/dot/d6-5-black.webp',\n 'modules/dice-so-nice/textures/dot/d6-6-black.webp',\n ],\n bumpMaps: [\n 'modules/dice-so-nice/textures/dot/d6-1-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-2-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-3-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-4-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-5-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-6-b.webp',\n ],\n system: \"dot_b\"\n});\n\n/**\n * foundry_vtt System\n */\nEXTRA_PRESETS_LIST.push({\n type: \"d2\",\n labels: ['1', 'F'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\",\n fontScale: 1.2\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d4\",\n labels: ['1', '2', '3', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\",\n fontScale: 0.8\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d6\",\n labels: ['1', '2', '3', '4', '5', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"df\",\n labels: ['−', ' ', '+'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d3\",\n labels: ['1', '2', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d8\",\n labels: ['1', '2', '3', '4', '5', '6', '7', 'F'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d10\",\n labels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\",\n fontScale: 0.9\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d5\",\n labels: ['1', '2', '3', '4', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\",\n fontScale: 0.9\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d100\",\n labels: ['10', '20', '30', '40', '50', '60', '70', '80', '90', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d12\",\n labels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d14\",\n labels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d7\",\n labels: ['1', '2', '3', '4', '5', '6', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d16\",\n labels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d20\",\n labels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', 'F'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d24\",\n labels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', 'F'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d30\",\n labels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\n\n\n/**\n * Spectrum System\n */\n\nEXTRA_PRESETS_LIST.push({\n type: \"df\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/df-m.webp',\n 'modules/dice-so-nice/textures/spectrumdice/df-0.webp',\n 'modules/dice-so-nice/textures/spectrumdice/df-p.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/df-m.webp',\n 'modules/dice-so-nice/textures/spectrumdice/df-0.webp',\n 'modules/dice-so-nice/textures/spectrumdice/df-p.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d2\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/d2-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d2-2.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/d2-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d2-2.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"dc\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/dc-h.webp',\n 'modules/dice-so-nice/textures/spectrumdice/dc-t.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/dc-h.webp',\n 'modules/dice-so-nice/textures/spectrumdice/dc-t.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d4\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/d4-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d4-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d4-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d4-4.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/d4-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d4-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d4-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d4-4.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d6\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/d6-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-6.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/d6-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-6.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d8\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/d8-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-6.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-7.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-8.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/d8-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-6.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-7.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-8.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d10\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/d10-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-6.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-7.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-8.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-9.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-0.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/d10-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-6.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-7.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-8.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-9.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-0.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d12\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/d12-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-6.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-7.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-8.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-9.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-10.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-11.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-12.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/d12-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-6.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-7.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-8.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-9.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-10.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-11.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-12.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d100\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/d100-10.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-20.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-30.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-40.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-50.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-60.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-70.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-80.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-90.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-00.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/d100-10.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-20.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-30.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-40.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-50.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-60.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-70.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-80.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-90.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-00.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d20\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/d20-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-6.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-7.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-8.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-9.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-10.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-11.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-12.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-13.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-14.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-15.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-16.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-17.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-18.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-19.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-20.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/d20-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-6.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-7.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-8.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-9.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-10.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-11.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-12.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-13.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-14.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-15.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-16.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-17.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-18.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-19.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-20.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n","export const TEXTURELIST = {\n\t'none': {\n\t\tname: 'DICESONICE.TextureNone',\n\t\tcomposite: 'source-over',\n\t\tsource: '',\n\t\tbump: ''\n\t},\n\t'cloudy': {\n\t\tname: 'DICESONICE.TextureCloudsTransparent',\n\t\tcomposite: 'destination-in',\n\t\tsource: 'modules/dice-so-nice/textures/cloudy.webp',\n\t\tbump: 'modules/dice-so-nice/textures/cloudy.alt.webp'\n\t},\n\t'cloudy_2': {\n\t\tname: 'DICESONICE.TextureClouds',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/cloudy.alt.webp',\n\t\tbump: 'modules/dice-so-nice/textures/cloudy.alt.webp'\n\t},\n\t'fire': {\n\t\tname: 'DICESONICE.TextureFire',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/fire.webp',\n\t\tbump: 'modules/dice-so-nice/textures/fire.webp'\n\t},\n\t'marble': {\n\t\tname: 'DICESONICE.TextureMarble',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/marble.webp',\n\t\tbump: '',\n\t\tmaterial: \"glass\"\n\t},\n\t'water': {\n\t\tname: 'DICESONICE.TextureWaterTransparent',\n\t\tcomposite: 'destination-in',\n\t\tsource: 'modules/dice-so-nice/textures/water.webp',\n\t\tbump: 'modules/dice-so-nice/textures/water.webp',\n\t\tmaterial: 'glass',\n\t},\n\t'water_2': {\n\t\tname: 'DICESONICE.TextureWater',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/water.webp',\n\t\tbump: 'modules/dice-so-nice/textures/water.webp',\n\t\tmaterial: 'glass',\n\t},\n\t'ice': {\n\t\tname: 'DICESONICE.TextureIceTransparent',\n\t\tcomposite: 'destination-in',\n\t\tsource: 'modules/dice-so-nice/textures/ice.webp',\n\t\tbump: 'modules/dice-so-nice/textures/ice.webp',\n\t\tmaterial: 'glass'\n\t},\n\t'ice_2': {\n\t\tname: 'DICESONICE.TextureIce',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/ice.webp',\n\t\tbump: 'modules/dice-so-nice/textures/ice.webp',\n\t\tmaterial: 'glass'\n\t},\n\t'paper': {\n\t\tname: 'DICESONICE.TexturePaper',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/paper.webp',\n\t\tbump: 'modules/dice-so-nice/textures/paper-bump.webp',\n\t\tmaterial: 'wood'\n\t},\n\t'speckles': {\n\t\tname: 'DICESONICE.TextureSpeckles',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/speckles.webp',\n\t\tbump: 'modules/dice-so-nice/textures/speckles.webp'\n\t},\n\t'glitter': {\n\t\tname: 'DICESONICE.TextureGlitter',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/glitter.webp',\n\t\tbump: 'modules/dice-so-nice/textures/glitter-bump.webp'\n\t},\n\t'glitter_2': {\n\t\tname: 'DICESONICE.TextureGlitterTransparent',\n\t\tcomposite: 'destination-in',\n\t\tsource: 'modules/dice-so-nice/textures/glitter-alpha.webp',\n\t\tbump: ''\n\t},\n\t'stars': {\n\t\tname: 'DICESONICE.TextureStars',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/stars.webp',\n\t\tbump: 'modules/dice-so-nice/textures/stars.webp'\n\t},\n\t'stainedglass': {\n\t\tname: 'DICESONICE.TextureStainedGlass',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/stainedglass.webp',\n\t\tbump: 'modules/dice-so-nice/textures/stainedglass-bump.webp',\n\t\tmaterial: 'iridescent'\n\t},\n\t'skulls': {\n\t\tname: 'DICESONICE.TextureSkulls',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/skulls.webp',\n\t\tbump: 'modules/dice-so-nice/textures/skulls.webp'\n\t},\n\t'leopard': {\n\t\tname: 'DICESONICE.TextureLeopard',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/leopard.webp',\n\t\tbump: 'modules/dice-so-nice/textures/leopard.webp',\n\t\tmaterial: 'wood'\n\t},\n\t'tiger': {\n\t\tname: 'DICESONICE.TextureTiger',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/tiger.webp',\n\t\tbump: 'modules/dice-so-nice/textures/tiger.webp',\n\t\tmaterial: 'wood'\n\t},\n\t'cheetah': {\n\t\tname: 'DICESONICE.TextureCheetah',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/cheetah.webp',\n\t\tbump: 'modules/dice-so-nice/textures/cheetah.webp',\n\t\tmaterial: 'wood'\n\t},\n\t'dragon': {\n\t\tname: 'Dragon',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/dragon.webp',\n\t\tbump: 'modules/dice-so-nice/textures/dragon-bump.webp'\n\t},\n\t'lizard': {\n\t\tname: 'Lizard',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/lizard.webp',\n\t\tbump: 'modules/dice-so-nice/textures/lizard-bump.webp'\n\t},\n\t'bird': {\n\t\tname: 'Bird',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/feather.webp',\n\t\tbump: 'modules/dice-so-nice/textures/feather-bump.webp'\n\t},\n\t'astral': {\n\t\tname: 'DICESONICE.TextureAstralSea',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/astral.webp',\n\t\tbump: 'modules/dice-so-nice/textures/stars.webp'\n\t},\n\t'wood': {\n\t\tname: 'DICESONICE.TextureWood',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/wood.webp',\n\t\tbump: 'modules/dice-so-nice/textures/wood.webp',\n\t\tmaterial: 'wood'\n\t},\n\t'metal': {\n\t\tname: 'DICESONICE.TextureMetal',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/metal.webp',\n\t\tbump: '',\n\t\tmaterial: 'metal'\n\t},\n\t'stone': {\n\t\tname: 'DICESONICE.TextureStone',\n\t\tcomposite: 'soft-light',\n\t\tsource: 'modules/dice-so-nice/textures/stone.webp',\n\t\tbump: 'modules/dice-so-nice/textures/stone.webp',\n\t\tmaterial: 'stone'\n\t},\n\t'radial': {\n\t\tname: 'DICESONICE.TextureRadial',\n\t\tcomposite: 'source-over',\n\t\tsource: 'modules/dice-so-nice/textures/radial.webp',\n\t\tbump: '',\n\t},\n\t'bronze01': {\n\t\tname: 'DICESONICE.TextureBronze1',\n\t\tcomposite: 'difference',\n\t\tsource: 'modules/dice-so-nice/textures/bronze01.webp',\n\t\tmaterial: 'metal',\n\t\tbump: ''\n\t},\n\t'bronze02': {\n\t\tname: 'DICESONICE.TextureBronze2',\n\t\tcomposite: 'difference',\n\t\tsource: 'modules/dice-so-nice/textures/bronze02.webp',\n\t\tmaterial: 'metal',\n\t\tbump: ''\n\t},\n\t'bronze03': {\n\t\tname: 'DICESONICE.TextureBronze3',\n\t\tcomposite: 'difference',\n\t\tsource: 'modules/dice-so-nice/textures/bronze03.webp',\n\t\tmaterial: 'metal',\n\t\tbump: ''\n\t},\n\t'bronze03a': {\n\t\tname: 'DICESONICE.TextureBronze3a',\n\t\tcomposite: 'difference',\n\t\tsource: 'modules/dice-so-nice/textures/bronze03a.webp',\n\t\tmaterial: 'metal',\n\t\tbump: ''\n\t},\n\t'bronze03b': {\n\t\tname: 'DICESONICE.TextureBronze3b',\n\t\tcomposite: 'difference',\n\t\tsource: 'modules/dice-so-nice/textures/bronze03b.webp',\n\t\tmaterial: 'metal',\n\t\tbump: ''\n\t},\n\t'bronze04': {\n\t\tname: 'DICESONICE.TextureBronze4',\n\t\tcomposite: 'difference',\n\t\tsource: 'modules/dice-so-nice/textures/bronze04.webp',\n\t\tmaterial: 'metal',\n\t\tbump: ''\n\t}\n};\n\nexport const COLORSETS = {\n\t'coin_default': {\n\t\tname: 'coin_default',\n\t\tdescription: 'DICESONICE.ColorCoinDefault',\n\t\tcategory: 'DICESONICE.AcquiredTaste',\n\t\tforeground: '#f6c928',\n\t\tbackground: '#f6c928',\n\t\toutline: 'none',\n\t\tedge: '#f6c928',\n\t\ttexture: 'metal',\n\t\tvisibility: 'hidden'\n\t},\n\t'spectrum_default': {\n\t\tname: 'spectrum_default',\n\t\tdescription: 'DICESONICE.ColorSpectrumDefault',\n\t\tcategory: 'DICESONICE.AcquiredTaste',\n\t\tforeground: '#ffffff',\n\t\tbackground: '#000000',\n\t\toutline: '#ffffff',\n\t\tedge: '#000000',\n\t\ttexture: 'none',\n\t\tvisibility: 'hidden',\n\t\tmaterial: 'pristine'\n\t},\n\t'radiant': {\n\t\tname: 'radiant',\n\t\tdescription: 'DICESONICE.ColorRadiant',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#F9B333',\n\t\tbackground: '#FFFFFF',\n\t\toutline: 'gray',\n\t\ttexture: 'paper'\n\t},\n\t'fire': {\n\t\tname: 'fire',\n\t\tdescription: 'DICESONICE.ColorFire',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#f8d84f',\n\t\tbackground: ['#f8d84f','#f9b02d','#f43c04','#910200','#4c1009'],\n\t\toutline: 'black',\n\t\ttexture: 'fire'\n\t},\n\t'ice': {\n\t\tname: 'ice',\n\t\tdescription: 'DICESONICE.ColorIce',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#60E9FF',\n\t\tbackground: ['#214fa3','#3c6ac1','#253f70','#0b56e2','#09317a'],\n\t\toutline: 'black',\n\t\ttexture: 'ice'\n\t},\n\t'cold': {\n\t\tname: 'cold',\n\t\tdescription: 'DICESONICE.ColorCold',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#60E9FF',\n\t\tbackground: ['#214fa3','#3c6ac1','#253f70','#0b56e2','#09317a'],\n\t\toutline: 'black',\n\t\ttexture: 'ice_2'\n\t},\n\t'poison': {\n\t\tname: 'poison',\n\t\tdescription: 'DICESONICE.ColorPoison',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#D6A8FF',\n\t\tbackground: ['#313866','#504099','#66409e','#934fc3','#c949fc'],\n\t\toutline: 'black',\n\t\ttexture: 'cloudy'\n\t},\n\t'acid': {\n\t\tname: 'acid',\n\t\tdescription: 'DICESONICE.ColorAcid',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#A9FF70',\n\t\tbackground: ['#a6ff00', '#83b625','#5ace04','#69f006','#b0f006','#93bc25'],\n\t\toutline: 'black',\n\t\ttexture: 'marble',\n\t\tmaterial: 'plastic'\n\t},\n\t'thunder': {\n\t\tname: 'thunder',\n\t\tdescription: 'DICESONICE.ColorThunder',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#FFC500',\n\t\tbackground: '#7D7D7D',\n\t\toutline: 'black',\n\t\ttexture: 'cloudy'\n\t},\n\t'lightning': {\n\t\tname: 'lightning',\n\t\tdescription: 'DICESONICE.ColorLightning',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#FFC500',\n\t\tbackground: ['#f17105', '#f3ca40','#eddea4','#df9a57','#dea54b'],\n\t\toutline: '#7D7D7D',\n\t\ttexture: 'ice'\n\t},\n\t'air': {\n\t\tname: 'air',\n\t\tdescription: 'DICESONICE.ColorAir',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#ffffff',\n\t\tbackground: ['#d0e5ea', '#c3dee5','#a4ccd6','#8dafb7','#80a4ad'],\n\t\toutline: 'black',\n\t\ttexture: 'cloudy'\n\t},\n\t'water': {\n\t\tname: 'water',\n\t\tdescription: 'DICESONICE.ColorWater',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#60E9FF',\n\t\tbackground: ['#87b8c4', '#77a6b2','#6b98a3','#5b8691','#4b757f'],\n\t\toutline: 'black',\n\t\ttexture: 'water'\n\t},\n\t'earth': {\n\t\tname: 'earth',\n\t\tdescription: 'DICESONICE.ColorEarth',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#6C9943',\n\t\tbackground: ['#346804', '#184200','#527f22', '#3a1d04', '#56341a','#331c17','#5a352a','#302210'],\n\t\toutline: 'black',\n\t\ttexture: 'speckles'\n\t},\n\t'force': {\n\t\tname: 'force',\n\t\tdescription: 'DICESONICE.ColorForce',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: 'white',\n\t\tbackground: ['#FF97FF', '#FF68FF','#C651C6'],\n\t\toutline: '#570000',\n\t\ttexture: 'stars'\n\t},\n\t'psychic': {\n\t\tname: 'psychic',\n\t\tdescription: 'DICESONICE.ColorPsychic',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#D6A8FF',\n\t\tbackground: ['#313866','#504099','#66409E','#934FC3','#C949FC','#313866'],\n\t\toutline: 'black',\n\t\ttexture: 'speckles'\n\t},\n\t'necrotic': {\n\t\tname: 'necrotic',\n\t\tdescription: 'DICESONICE.ColorNecrotic',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#ffffff',\n\t\tbackground: '#6F0000',\n\t\toutline: 'black',\n\t\ttexture: 'skulls'\n\t},\n\t'breebaby': {\n\t\tname: 'breebaby',\n\t\tdescription: 'DICESONICE.ColorPastelSunset',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: ['#5E175E', '#564A5E','#45455E','#3D5A5E','#1E595E','#5E3F3D','#5E1E29','#283C5E','#25295E'],\n\t\tbackground: ['#FE89CF', '#DFD4F2','#C2C2E8','#CCE7FA','#A1D9FC','#F3C3C2','#EB8993','#8EA1D2','#7477AD'],\n\t\toutline: 'white',\n\t\ttexture: 'marble',\n\t\tmaterial: 'plastic'\n\t},\n\t'pinkdreams': {\n\t\tname: 'pinkdreams',\n\t\tdescription: 'DICESONICE.ColorPinkDreams',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: 'white',\n\t\tbackground: ['#ff007c', '#df73ff','#f400a1','#df00ff','#ff33cc'],\n\t\toutline: '#570000',\n\t\ttexture: 'skulls'\n\t},\n\t'inspired': {\n\t\tname: 'inspired',\n\t\tdescription: 'DICESONICE.ColorInspired',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: '#FFD800',\n\t\tbackground: '#C4C4B6',\n\t\toutline: '#000000',\n\t\ttexture: 'stone'\n\t},\n\t'bloodmoon': {\n\t\tname: 'bloodmoon',\n\t\tdescription: 'DICESONICE.ColorBloodMoon',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: '#CDB800',\n\t\tbackground: '#6F0000',\n\t\toutline: 'black',\n\t\ttexture: 'marble',\n\t\tmaterial: 'plastic'\n\t},\n\t'starynight': {\n\t\tname: 'starynight',\n\t\tdescription: 'DICESONICE.ColorStaryNight',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: '#4F708F',\n\t\tbackground: ['#091636','#233660','#4F708F','#8597AD','#E2E2E2'],\n\t\toutline: 'white',\n\t\ttexture: 'speckles'\n\t},\n\t'glitterparty': {\n\t\tname: 'glitterparty',\n\t\tdescription: 'DICESONICE.ColorGlitterParty',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: 'white',\n\t\tbackground: ['#FFB5F5','#7FC9FF','#A17FFF'],\n\t\toutline: 'none',\n\t\ttexture: 'glitter'\n\t},\n\t'astralsea': {\n\t\tname: 'astralsea',\n\t\tdescription: 'DICESONICE.ColorAstralSea',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: '#565656',\n\t\tbackground: 'white',\n\t\toutline: 'none',\n\t\ttexture: 'astral'\n\t},\n\t'foundry': {\n\t\tname: 'foundry',\n\t\tdescription: 'DICESONICE.ColorFoundry',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: '#000000',\n\t\tbackground: '#ffffff',\n\t\toutline: 'none',\n\t\tedge: '#000000',\n\t\ttexture: 'radial'\n\t},\n\t'dragons': {\n\t\tname: 'dragons',\n\t\tdescription: 'DICESONICE.ColorDragons',\n\t\tcategory: 'DICESONICE.AcquiredTaste',\n\t\tforeground: '#FFFFFF',\n\t\t// \t\t\t[ red, black, blue, green white gold, silver, bronze, copper brass\n\t\tbackground: ['#B80000', '#4D5A5A', '#5BB8FF', '#7E934E', '#FFFFFF', '#F6ED7C', '#7797A3', '#A78437', '#862C1A', '#FFDF8A'],\n\t\toutline: 'black',\n\t\ttexture: ['dragon', 'lizard'],\n\t\tdescription: 'Here be Dragons'\n\t},\n\t'birdup': {\n\t\tname: 'birdup',\n\t\tdescription: 'DICESONICE.ColorBirdUp',\n\t\tcategory: 'DICESONICE.AcquiredTaste',\n\t\tforeground: '#FFFFFF',\n\t\tbackground: ['#F11602', '#FFC000', '#6EC832', '#0094BC', '#05608D', '#FEABB3', '#F75680', '#F3F0DF', '#C7A57F'],\n\t\toutline: 'black',\n\t\ttexture: 'bird',\n\t\tdescription: 'Bird Up!'\n\t},\n\t'tigerking': {\n\t\tname: 'tigerking',\n\t\tdescription: 'DICESONICE.ColorTigerKing',\n\t\tcategory: 'DICESONICE.AcquiredTaste',\n\t\tforeground: '#ffffff',\n\t\tbackground: '#FFCC40',\n\t\toutline: 'black',\n\t\ttexture: ['leopard', 'tiger', 'cheetah']\n\t},\n\t'toxic': {\n\t\tname: 'toxic',\n\t\tdescription: 'DICESONICE.ColorToxic',\n\t\tcategory: 'DICESONICE.AcquiredTaste',\n\t\tforeground: '#A9FF70',\n\t\tbackground: ['#a6ff00', '#83b625','#5ace04','#69f006','#b0f006','#93bc25'],\n\t\toutline: 'black',\n\t\ttexture: 'fire'\n\t},\n\t'rainbow': {\n\t\tname: 'rainbow',\n\t\tdescription: 'DICESONICE.ColorRainblow',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: ['#FF5959','#FFA74F','#FFFF56','#59FF59','#2374FF','#00FFFF','#FF59FF'],\n\t\tbackground: ['#900000','#CE3900','#BCBC00','#00B500','#00008E','#008282','#A500A5'],\n\t\toutline: 'black',\n\t\ttexture: 'none'\n\t},\n\t'random': {\n\t\tname: 'random',\n\t\tdescription: 'DICESONICE.ColorRaNdOm',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: [],\n\t\toutline: [],\n\t\tbackground: [],\n\t\ttexture: []\n\t},\n\t'black': {\n\t\tname: 'black',\n\t\tdescription: 'DICESONICE.ColorBlack',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#ffffff',\n\t\tbackground: '#000000',\n\t\toutline: 'black',\n\t\ttexture: 'none'\n\t},\n\t'white': {\n\t\tname: 'white',\n\t\tdescription: 'DICESONICE.ColorWhite',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#000000',\n\t\tbackground: '#FFFFFF',\n\t\toutline: '#FFFFFF',\n\t\ttexture: 'none'\n\t},\n\t'grey': {\n\t\tname: 'grey',\n\t\tdescription: 'DICESONICE.ColorGrey',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#FFFFFF',\n\t\tbackground: '#888888',\n\t\toutline: '#000000',\n\t\ttexture: 'none'\n\t},\n\t'red': {\n\t\tname: 'red',\n\t\tdescription: 'DICESONICE.ColorRed',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#FFFFFF',\n\t\tbackground: '#FF0000',\n\t\toutline: 'none',\n\t\ttexture: 'none'\n\t},\n\t'blue': {\n\t\tname: 'blue',\n\t\tdescription: 'DICESONICE.ColorBlue',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#FFFFFF',\n\t\tbackground: '#0000FF',\n\t\toutline: 'none',\n\t\ttexture: 'none'\n\t},\n\t'green': {\n\t\tname: 'green',\n\t\tdescription: 'DICESONICE.ColorGreen',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#FFFFFF',\n\t\tbackground: '#00FF00',\n\t\toutline: 'none',\n\t\ttexture: 'none'\n\t},\n\t'yellow': {\n\t\tname: 'yellow',\n\t\tdescription: 'DICESONICE.ColorYellow',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#000000',\n\t\tbackground: '#FFFF00',\n\t\toutline: 'none',\n\t\ttexture: 'none'\n\t},\n\t'pink': {\n\t\tname: 'pink',\n\t\tdescription: 'DICESONICE.ColorPink',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#FFFFFF',\n\t\tbackground: '#FF00FF',\n\t\toutline: 'none',\n\t\ttexture: 'none'\n\t},\n\t'cyan': {\n\t\tname: 'cyan',\n\t\tdescription: 'DICESONICE.ColorCyan',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#000000',\n\t\tbackground: '#00FFFF',\n\t\toutline: 'none',\n\t\ttexture: 'none'\n\t},\n\t'prism': {\n\t\tname: 'prism',\n\t\tdescription: 'DICESONICE.ColorPrism',\n\t\tcategory: 'DICESONICE.AcquiredTaste',\n\t\tforeground: '#FFFFFF',\n\t\tbackground: '#FFFFFF',\n\t\toutline: 'black',\n\t\ttexture: 'stainedglass'\n\t},\n\t'bronze': {\n\t\tname: 'bronze',\n\t\tdescription: 'DICESONICE.ColorBronze',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: ['#FF9159','#FFB066','#FFBF59','#FFD059'],\n\t\tbackground: ['#705206','#7A4E06','#643100','#7A2D06'],\n\t\toutline: ['#3D2D03','#472D04','#301700','#471A04'],\n\t\tedge: ['#FF5D0D','#FF7B00','#FFA20D','#FFBA0D'],\n\t\ttexture: [['bronze01','bronze02','bronze03','bronze03b','bronze03b','bronze04']]\n\t},\n\t'custom': {\n\t\tname: 'custom',\n\t\tdescription: 'DICESONICE.ColorCustom',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '',\n\t\tbackground: '',\n\t\toutline: '',\n\t\tedge: '',\n\t\ttexture: 'none'\n\t}\n};\n\nexport const DICE_SCALE = {\n\t\"d2\":1,\n\t\"d4\":1,\n\t\"d6\":1.3,\n\t\"d8\":1.1,\n\t\"d10\":1,\n\t\"d12\":1.1,\n\t\"d14\":0.5,\n\t\"d16\":0.5,\n\t\"d20\":1,\n\t\"d24\":1,\n\t\"d30\":0.75,\n\t\"d3\":1.3,\n\t\"d5\":1,\n\t\"d7\":0.5,\n\t\"df\":2,\n\t\"d100\":0.75\n};\n\nexport class DiceColors {\n\n\tstatic loadTextures(sources, callback) {\n\n\t\tlet images = {};\n\t\tlet bumps = {};\n\t\tlet loadedImages = 0;\n\t\n\t\tlet itemprops = Object.entries(sources);\n\t\tlet numImages = itemprops.length*2; //One for texture, one for bump texture\n\t\tfor (const [key, value] of itemprops) {\n\n\t\t\tif(value.source === '') {\n\t\t\t\tloadedImages+=2;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\n\t\t\timages[key] = new Image();\n\t\t\timages[key].crossOrigin = \"Anonymous\";\n\t\t\timages[key].onload = function() {\n\t\n\t\t\t\tif (++loadedImages >= numImages) {\n\t\t\t\t\tDiceColors.diceTextures = foundry.utils.mergeObject(images, DiceColors.diceTextures || {},{performDeletions:true});\n\t\t\t\t\tDiceColors.diceBumps = foundry.utils.mergeObject(bumps, DiceColors.diceBumps || {},{performDeletions:true});\n\t\t\t\t\tcallback(images);\n\t\t\t\t}\n\t\t\t};\n\t\t\timages[key].src = value.source;\n\n\t\t\tif(value.bump === '') {\n\t\t\t\t++loadedImages;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tbumps[key] = new Image();\n\t\t\tbumps[key].crossOrigin = \"Anonymous\";\n\t\t\tbumps[key].onload = function() {\n\t\n\t\t\t\tif (++loadedImages >= numImages) {\n\t\t\t\t\tDiceColors.diceTextures = foundry.utils.mergeObject(images, DiceColors.diceTextures || {},{performDeletions:true});\n\t\t\t\t\tDiceColors.diceBumps = foundry.utils.mergeObject(bumps, DiceColors.diceBumps || {},{performDeletions:true});\n\t\t\t\t\tcallback(images);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tbumps[key].src = value.bump;\n\t\t}\n\t}\n\t\n\tstatic getTexture(texturename) {\n\t\n\t\tif (Array.isArray(texturename)) {\n\t\n\t\t\tlet textures = [];\n\t\t\tfor(let i = 0, l = texturename.length; i < l; i++){\n\t\t\t\tif (typeof texturename[i] == 'string' || Array.isArray(texturename[i])) {\n\t\t\t\t\ttextures.push(this.getTexture(texturename[i]));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn textures;\n\t\t}\n\t\n\t\tif (!texturename || texturename == '') {\n\t\t\treturn {name:'',texture:'',material:\"plastic\"};\n\t\t}\n\t\n\t\tif (texturename == 'none') {\n\t\t\treturn {name:'none',texture:'',material:\"plastic\"};\n\t\t}\n\t\n\t\tif(texturename == 'random') {\n\t\t\tlet names = Object.keys(DiceColors.diceTextures);\n\t\t\t// add 'none' for possibility of no texture\n\t\t\tnames.pop(); //remove 'random' from this list\n\t\n\t\t\treturn this.getTexture(names[Math.floor(Math.random() * names.length)]);\n\t\t}\n\t\t//Init not done yet, let the init load the texture\n\t\tif(!DiceColors.diceTextures)\n\t\t\treturn texturename;\n\t\tif (DiceColors.diceTextures[texturename] != null) {\n\t\t\tif(!TEXTURELIST[texturename].material)\n\t\t\t\tTEXTURELIST[texturename].material = \"plastic\";\n\t\t\tif(!DiceColors.diceBumps[texturename])\n\t\t\t\tDiceColors.diceBumps[texturename] = '';\n\t\t\treturn { name: texturename, bump: DiceColors.diceBumps[texturename], material: TEXTURELIST[texturename].material, texture: DiceColors.diceTextures[texturename], composite: TEXTURELIST[texturename].composite };\n\t\t}\n\t\treturn {name:'',texture:''};\n\t}\n\t\n\tstatic randomColor() {\n\t\t// random colors\n\t\tlet rgb=[];\n\t\trgb[0] = Math.floor(Math.random() * 254);\n\t\trgb[1] = Math.floor(Math.random() * 254);\n\t\trgb[2] = Math.floor(Math.random() * 254);\n\t\n\t\t// this is an attempt to make the foregroudn color stand out from the background color\n\t\t// it sometimes produces ok results\n\t\tlet brightness = ((parseInt(rgb[0]) * 299) + (parseInt(rgb[1]) * 587) + (parseInt(rgb[2]) * 114)) / 1000;\n\t\tlet foreground = (brightness > 126) ? 'rgb(30,30,30)' : 'rgb(230,230,230)'; // high brightness = dark text, else bright text\n\t\tlet background = 'rgb(' + rgb[0] + ',' + rgb[1] + ',' + rgb[2] + ')';\n\t\n\t\treturn {background: background, foreground: foreground };\n\t}\n\t\n\tstatic initColorSets(entries = null) {\n\t\tlet sets;\n\t\tif(entries)\n\t\t{\n\t\t\tlet uniqueSet = {};\n\t\t\tuniqueSet[entries.name] = entries;\n\t\t\tsets = Object.entries(uniqueSet);\n\t\t}\n\t\telse\n\t\t\tsets = Object.entries(COLORSETS);\n\t\tfor (const [name, data] of sets) {\n\t\t\tCOLORSETS[name].id = name;\n\t\t\tif(data.texture != \"custom\")\n\t\t\t\tCOLORSETS[name].texture = this.getTexture(data.texture);\n\t\t\tif(typeof COLORSETS[name].texture == \"object\")\n\t\t\t\tCOLORSETS[name].texture.id = data.texture;\n\t\t\tif(!COLORSETS[name].material)\n\t\t\t\tCOLORSETS[name].material = '';\n\t\t\tif(!COLORSETS[name].font)\n\t\t\t\tCOLORSETS[name].font = 'Arial';\n\t\t\tif(!COLORSETS[name].fontScale)\n\t\t\t\tCOLORSETS[name].fontScale = DICE_SCALE;\n\t\t\telse\n\t\t\t\tCOLORSETS[name].fontScale = foundry.utils.mergeObject(DICE_SCALE,COLORSETS[name].fontScale,{inplace:false,performDeletions:true});\n\t\t\tif(!COLORSETS[name].visibility)\n\t\t\t\tCOLORSETS[name].visibility = \"visible\";\n\t\t}\n\t\t\n\t\t// generate the colors and textures for the random set\n\t\tif(!entries)\n\t\t{\n\t\t\tfor (let i = 0; i < 10; i++) {\n\t\t\t\tlet randcolor = this.randomColor();\n\t\t\t\tlet randtex = this.getTexture('random');\n\t\t\n\t\t\t\tif (randtex.name != '') {\n\t\t\t\t\tCOLORSETS['random'].foreground.push(randcolor.foreground); \n\t\t\t\t\tCOLORSETS['random'].background.push(randcolor.background);\n\t\t\t\t\tCOLORSETS['random'].outline.push(randcolor.background);\n\t\t\t\t\tCOLORSETS['random'].texture.push(randtex);\n\t\t\t\t} else {\n\t\t\t\t\tCOLORSETS['random'].foreground.push(randcolor.foreground); \n\t\t\t\t\tCOLORSETS['random'].background.push(randcolor.background);\n\t\t\t\t\tCOLORSETS['random'].outline.push('black');\n\t\t\t\t\tCOLORSETS['random'].texture.push('');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tstatic getColorSet(colorsetname) {\n\t\tlet colorset = COLORSETS[colorsetname] || COLORSETS['custom'];\n\t\treturn {...colorset};\n\t}\n\n\tstatic setColorCustom(foreground = '#FFFFFF', background = '#000000', outline = '#FFFFFF', edge = '#FFFFFF'){\n\t\tCOLORSETS['custom'].foreground = foreground;\n\t\tCOLORSETS['custom'].background = background;\n\t\tCOLORSETS['custom'].outline = outline;\n\t\tCOLORSETS['custom'].edge = edge;\n\t}\n}\n","export const DICE_MODELS = {\n \"d2\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"29D8FA3F-1F04-4F5A-985B-16353BAB0B2C\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [88.93379974365234,0.0001336209534201771,-4.532903671264648,88.93379974365234,0.0001336209534201771,-4.532903671264648,88.93379974365234,0.0001336209534201771,-4.532903671264648,90.8361587524414,-0.00006830116763012484,-2.6535863876342773,90.8361587524414,-0.00006830116763012484,-2.6535863876342773,84.580078125,-27.482694625854492,4.547501087188721,84.580078125,-27.482694625854492,4.547501087188721,86.38970947265625,-28.07042121887207,2.668496608734131,27.482057571411133,-84.58028411865234,-4.547504901885986,27.482057571411133,-84.58028411865234,-4.547504901885986,28.06978416442871,-86.38990783691406,-2.6685009002685547,27.481149673461914,-84.58119201660156,4.536083698272705,27.481149673461914,-84.58119201660156,4.536083698272705,28.069250106811523,-86.39043426513672,2.6568350791931152,-0.0007737207342870533,-88.93378448486328,4.532901287078857,-0.0007737207342870533,-88.93378448486328,4.532901287078857,-0.0007737207342870533,-88.93378448486328,4.532901287078857,-0.0005998046253807843,-90.83614349365234,2.6535849571228027,-0.0005998046253807843,-90.83614349365234,2.6535849571228027,-27.482694625854492,-84.58097839355469,4.5305891036987305,-27.482694625854492,-84.58097839355469,4.5305891036987305,-28.07042121887207,-86.39022827148438,2.6512229442596436,-84.58029174804688,-27.481143951416016,-4.552997589111328,-84.58029174804688,-27.481143951416016,-4.552997589111328,-86.3899154663086,-28.06924819946289,-2.6741106510162354,-88.93379974365234,-0.0001336209534201771,4.532903671264648,-88.93379974365234,-0.0001336209534201771,4.532903671264648,-88.93379974365234,-0.0001336209534201771,4.532903671264648,-90.8361587524414,0.00006830116763012484,2.6535863876342773,-90.8361587524414,0.00006830116763012484,2.6535863876342773,-71.94794464111328,52.27442169189453,-4.543759822845459,-71.94794464111328,52.27442169189453,-4.543759822845459,-73.4873275756836,53.39253234863281,-2.664675235748291,-71.9488525390625,52.27351379394531,4.539828777313232,-71.9488525390625,52.27351379394531,4.539828777313232,-73.48785400390625,53.391998291015625,2.6606605052948,-52.27299499511719,71.94922637939453,-4.539824962615967,-52.27299499511719,71.94922637939453,-4.539824962615967,-53.39146423339844,73.48823547363281,-2.660656213760376,-27.482057571411133,84.58028411865234,4.547504901885986,-27.482057571411133,84.58028411865234,4.547504901885986,-28.06978416442871,86.38990783691406,2.6685009002685547,0.0007736866245977581,88.93378448486328,-4.532901287078857,0.0007736866245977581,88.93378448486328,-4.532901287078857,0.0007736866245977581,88.93378448486328,-4.532901287078857,0.0005998046253807843,90.83614349365234,-2.6535849571228027,0.0005998046253807843,90.83614349365234,-2.6535849571228027,-0.00013426830992102623,88.93287658691406,4.550687789916992,-0.00013426830992102623,88.93287658691406,4.550687789916992,-0.00013426830992102623,88.93287658691406,4.550687789916992,0.00006751317414455116,90.83562469482422,2.6717519760131836,0.00006751317414455116,90.83562469482422,2.6717519760131836,27.482694625854492,84.58097839355469,-4.5305891036987305,27.482694625854492,84.58097839355469,-4.5305891036987305,28.07042121887207,86.39022827148438,-2.6512229442596436,84.5811996459961,27.482053756713867,-4.530590534210205,84.5811996459961,27.482053756713867,-4.530590534210205,86.39044189453125,28.069782257080078,-2.651224374771118,84.58098602294922,-27.48178482055664,-4.5360870361328125,84.58098602294922,-27.48178482055664,-4.5360870361328125,86.3902359008789,-28.069887161254883,-2.6568384170532227,73.48785400390625,-53.391998291015625,-2.6606605052948,71.9488525390625,-52.27351379394531,-4.539828777313232,71.9488525390625,-52.27351379394531,-4.539828777313232,52.273902893066406,-71.94831848144531,-4.543763637542725,52.273902893066406,-71.94831848144531,-4.543763637542725,53.39199447631836,-73.48770904541016,-2.6646788120269775,0.00013430237595457584,-88.93287658691406,-4.550687789916992,0.00013430237595457584,-88.93287658691406,-4.550687789916992,0.00013430237595457584,-88.93287658691406,-4.550687789916992,-0.00006751317414455116,-90.83562469482422,-2.6717519760131836,-0.00006751317414455116,-90.83562469482422,-2.6717519760131836,-28.069887161254883,-86.38970184326172,-2.6741127967834473,-27.48178482055664,-84.58007049560547,-4.552999496459961,-27.48178482055664,-84.58007049560547,-4.552999496459961,-52.27351760864258,-71.94794464111328,-4.5542144775390625,-52.27351760864258,-71.94794464111328,-4.5542144775390625,-53.39200210571289,-73.4873275756836,-2.67535400390625,-71.94832611083984,-52.27299118041992,-4.554214000701904,-71.94832611083984,-52.27299118041992,-4.554214000701904,-73.48771667480469,-53.391456604003906,-2.675353527069092,-88.93289947509766,0.0007747426279820502,-4.550684928894043,-88.93289947509766,0.0007747426279820502,-4.550684928894043,-88.93289947509766,0.0007747426279820502,-4.550684928894043,-90.83563995361328,0.000600832630880177,-2.671748399734497,-90.83563995361328,0.000600832630880177,-2.671748399734497,-84.580078125,27.482694625854492,-4.547501087188721,-84.580078125,27.482694625854492,-4.547501087188721,-86.38970947265625,28.07042121887207,-2.668496608734131,-27.481149673461914,84.58119201660156,-4.536083698272705,-27.481149673461914,84.58119201660156,-4.536083698272705,-28.069250106811523,86.39043426513672,-2.6568350791931152,52.2744255065918,71.94884490966797,-4.529373645782471,52.2744255065918,71.94884490966797,-4.529373645782471,53.39253616333008,73.48784637451172,-2.649981737136841,71.94922637939453,52.273895263671875,-4.529374599456787,71.94922637939453,52.273895263671875,-4.529374599456787,73.48823547363281,53.391990661621094,-2.649982452392578,88.93289947509766,-0.0007747426279820502,4.550684928894043,88.93289947509766,-0.0007747426279820502,4.550684928894043,88.93289947509766,-0.0007747426279820502,4.550684928894043,90.83563995361328,-0.000600832630880177,2.671748399734497,90.83563995361328,-0.000600832630880177,2.671748399734497,71.94794464111328,-52.27442169189453,4.543759346008301,71.94794464111328,-52.27442169189453,4.543759346008301,73.4873275756836,-53.39253234863281,2.664675235748291,52.27299499511719,-71.94922637939453,4.539824962615967,52.27299499511719,-71.94922637939453,4.539824962615967,53.39146423339844,-73.48823547363281,2.660656213760376,-52.2744255065918,-71.94884490966797,4.529373645782471,-52.2744255065918,-71.94884490966797,4.529373645782471,-53.39253616333008,-73.48784637451172,2.649981737136841,-73.48823547363281,-53.391990661621094,2.649982452392578,-71.94922637939453,-52.273895263671875,4.529374599456787,-71.94922637939453,-52.273895263671875,4.529374599456787,-84.5811996459961,-27.482053756713867,4.530590534210205,-84.5811996459961,-27.482053756713867,4.530590534210205,-86.39044189453125,-28.069782257080078,2.651224374771118,-84.58098602294922,27.48178482055664,4.5360870361328125,-84.58098602294922,27.48178482055664,4.5360870361328125,-86.3902359008789,28.069887161254883,2.6568384170532227,-52.273902893066406,71.94831848144531,4.543763637542725,-52.273902893066406,71.94831848144531,4.543763637542725,-53.39199447631836,73.48770904541016,2.6646788120269775,27.48178482055664,84.58007049560547,4.552999496459961,27.48178482055664,84.58007049560547,4.552999496459961,28.069887161254883,86.38970184326172,2.6741127967834473,52.27351760864258,71.94794464111328,4.5542144775390625,52.27351760864258,71.94794464111328,4.5542144775390625,53.39200210571289,73.4873275756836,2.67535400390625,73.48771667480469,53.391456604003906,2.675353527069092,71.94832611083984,52.27299118041992,4.554214000701904,71.94832611083984,52.27299118041992,4.554214000701904,84.58029174804688,27.481143951416016,4.552997589111328,84.58029174804688,27.481143951416016,4.552997589111328,86.3899154663086,28.06924819946289,2.6741106510162354],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [0.004305333364754915,0.00014043168630450964,-0.9999908208847046,0.004305333364754915,0.00014043168630450964,-0.9999908208847046,0.004305333364754915,0.00014043168630450964,-0.9999908208847046,0.967370867729187,0.000023871660232543945,-0.2533644437789917,0.967370867729187,0.000023871660232543945,-0.2533644437789917,0.003924518823623657,-0.0014061331748962402,0.9999912977218628,0.003924518823623657,-0.0014061331748962402,0.9999912977218628,0.919967532157898,-0.2989548146724701,0.25354647636413574,0.0014187097549438477,-0.003943443298339844,-0.9999911785125732,0.0014187097549438477,-0.003943443298339844,-0.9999911785125732,0.2989460825920105,-0.9199705719947815,-0.2535456418991089,0.001207306981086731,-0.004139244556427002,0.999990701675415,0.001207306981086731,-0.004139244556427002,0.999990701675415,0.29889336228370667,-0.9200217723846436,0.25342196226119995,-0.00010144524276256561,-0.004305422306060791,0.9999908208847046,-0.00010144524276256561,-0.004305422306060791,0.9999908208847046,-0.00010144524276256561,-0.004305422306060791,0.9999908208847046,-0.00002811197191476822,-0.9673709869384766,0.25336405634880066,-0.00002811197191476822,-0.9673709869384766,0.25336405634880066,-0.0013865083456039429,-0.0041558146476745605,0.9999904036521912,-0.0013865083456039429,-0.0041558146476745605,0.9999904036521912,-0.29895341396331787,-0.9200186133384705,0.25336307287216187,-0.003935068845748901,-0.0012163519859313965,-0.9999915361404419,-0.003935068845748901,-0.0012163519859313965,-0.9999915361404419,-0.9199703335762024,-0.2988958954811096,-0.25360578298568726,-0.00432974100112915,-0.00013017654418945312,0.9999905824661255,-0.00432974100112915,-0.00013017654418945312,0.9999905824661255,-0.00432974100112915,-0.00013017654418945312,0.9999905824661255,-0.967370867729187,-0.000022581778466701508,0.2533644139766693,-0.967370867729187,-0.000022581778466701508,0.2533644139766693,-0.003362357383593917,0.002567464951425791,-0.9999910593032837,-0.003362357383593917,0.002567464951425791,-0.9999910593032837,-0.7825664281845093,0.5686163306236267,-0.253506064414978,-0.0035184919834136963,0.0023897886276245117,0.9999909996986389,-0.0035184919834136963,0.0023897886276245117,0.9999909996986389,-0.7826218605041504,0.5685698390007019,0.25343894958496094,-0.002216615015640855,0.0036201775074005127,-0.9999910593032837,-0.002216615015640855,0.0036201775074005127,-0.9999910593032837,-0.5685653686523438,0.782625675201416,-0.25343722105026245,-0.0013963840901851654,0.0039055049419403076,0.9999913573265076,-0.0013963840901851654,0.0039055049419403076,0.9999913573265076,-0.2989453971385956,0.9199708104133606,0.2535455524921417,0.00011461973190307617,0.004342749714851379,-0.9999904632568359,0.00011461973190307617,0.004342749714851379,-0.9999904632568359,0.00011461973190307617,0.004342749714851379,-0.9999904632568359,0.000028920238037244417,0.9673709273338318,-0.25336408615112305,0.000028920238037244417,0.9673709273338318,-0.25336408615112305,-0.00009849853813648224,0.0041036903858184814,0.9999915957450867,-0.00009849853813648224,0.0041036903858184814,0.9999915957450867,-0.00009849853813648224,0.0041036903858184814,0.9999915957450867,-0.00001982133835554123,0.967315137386322,0.2535773515701294,-0.00001982133835554123,0.967315137386322,0.2535773515701294,0.001379296649247408,0.004155764821916819,-0.9999904632568359,0.001379296649247408,0.004155764821916819,-0.9999904632568359,0.2989526391029358,0.9200189113616943,-0.25336307287216187,0.004105646628886461,0.0014420022489503026,-0.9999905824661255,0.004105646628886461,0.0014420022489503026,-0.9999905824661255,0.9200265407562256,0.29895055294036865,-0.25333744287490845,0.0041483743116259575,-0.001177109545096755,-0.999990701675415,0.0041483743116259575,-0.001177109545096755,-0.999990701675415,0.92001873254776,-0.29890236258506775,-0.2534225881099701,0.7826225161552429,-0.5685691237449646,-0.2534385919570923,0.0034059027675539255,-0.002543120877817273,-0.9999909400939941,0.0034059027675539255,-0.002543120877817273,-0.9999909400939941,0.0025934576988220215,-0.0033233165740966797,-0.9999910593032837,0.0025934576988220215,-0.0033233165740966797,-0.9999910593032837,0.5686105489730835,-0.7825710773468018,-0.2535049617290497,0.00014024082338437438,-0.004108965862542391,-0.9999915361404419,0.00014024082338437438,-0.004108965862542391,-0.9999915361404419,0.00014024082338437438,-0.004108965862542391,-0.9999915361404419,0.000021778512746095657,-0.9673150777816772,-0.253577321767807,0.000021778512746095657,-0.9673150777816772,-0.253577321767807,-0.29890191555023193,-0.9199681878089905,-0.2536064684391022,-0.001328025944530964,-0.003906830679625273,-0.9999914765357971,-0.001328025944530964,-0.003906830679625273,-0.9999914765357971,-0.0024206042289733887,-0.0033184662461280823,-0.9999915361404419,-0.0024206042289733887,-0.0033184662461280823,-0.9999915361404419,-0.56856769323349,-0.7825732231140137,-0.25359416007995605,-0.0033223330974578857,-0.002392679452896118,-0.9999916553497314,-0.0033223330974578857,-0.002392679452896118,-0.9999916553497314,-0.7825719118118286,-0.5685604810714722,-0.25361454486846924,-0.004138410557061434,0.00005978979606879875,-0.9999914169311523,-0.004138410557061434,0.00005978979606879875,-0.9999914169311523,-0.004138410557061434,0.00005978979606879875,-0.9999914169311523,-0.9673154950141907,0.00002910134026024025,-0.25357601046562195,-0.9673154950141907,0.00002910134026024025,-0.25357601046562195,-0.003914192318916321,0.0014359354972839355,-0.9999912977218628,-0.003914192318916321,0.0014359354972839355,-0.9999912977218628,-0.9199680089950562,0.29895293712615967,-0.2535468339920044,-0.001218944787979126,0.004143953323364258,-0.9999906420707703,-0.001218944787979126,0.004143953323364258,-0.9999906420707703,-0.2988971769809723,0.920020580291748,-0.25342193245887756,0.002553605241701007,0.003544599749147892,-0.9999905228614807,0.002553605241701007,0.003544599749147892,-0.9999905228614807,0.5686197876930237,0.7826223373413086,-0.25332552194595337,0.0034990310668945312,0.0025759339332580566,-0.9999905824661255,0.0034990310668945312,0.0025759339332580566,-0.9999905824661255,0.7826220393180847,0.5686109662055969,-0.25334614515304565,0.004121424164623022,0.00009648066043155268,0.9999914169311523,0.004121424164623022,0.00009648066043155268,0.9999914169311523,0.004121424164623022,0.00009648066043155268,0.9999914169311523,0.9673154950141907,-0.00002708425745368004,0.2535760700702667,0.9673154950141907,-0.00002708425745368004,0.2535760700702667,0.0033468306064605713,-0.002586185932159424,0.9999910593032837,0.0033468306064605713,-0.002586185932159424,0.9999910593032837,0.7825667858123779,-0.5686154365539551,0.25350672006607056,0.002382144331932068,-0.003524601459503174,0.9999909996986389,0.002382144331932068,-0.003524601459503174,0.9999909996986389,0.5685621500015259,-0.7826279401779175,0.2534373998641968,-0.0025890469551086426,-0.003517657518386841,0.9999905228614807,-0.0025890469551086426,-0.003517657518386841,0.9999905228614807,-0.5686206817626953,-0.7826217412948608,0.253325492143631,-0.7826230525970459,-0.5686094760894775,0.25334617495536804,-0.003505319356918335,-0.002576306462287903,0.9999906420707703,-0.003505319356918335,-0.002576306462287903,0.9999906420707703,-0.0041239261627197266,-0.001402430236339569,0.9999905228614807,-0.0041239261627197266,-0.001402430236339569,0.9999905228614807,-0.9200277328491211,-0.29894667863845825,0.2533373534679413,-0.0041457414627075195,0.0012131333351135254,0.999990701675415,-0.0041457414627075195,0.0012131333351135254,0.999990701675415,-0.9200185537338257,0.29890307784080505,0.2534220814704895,-0.0025840699672698975,0.003327280282974243,0.9999911785125732,-0.0025840699672698975,0.003327280282974243,0.9999911785125732,-0.5686099529266357,0.7825716137886047,0.2535049021244049,0.0012101978063583374,0.003936886787414551,0.9999915361404419,0.0012101978063583374,0.003936886787414551,0.9999915361404419,0.2989037334918976,0.9199675917625427,0.2536064088344574,0.0023893117904663086,0.003317922353744507,0.9999916553497314,0.0023893117904663086,0.003317922353744507,0.9999916553497314,0.5685685873031616,0.7825725674629211,0.2535940706729889,0.782572329044342,0.5685595870018005,0.25361499190330505,0.0033287405967712402,0.002385169267654419,0.9999915361404419,0.0033287405967712402,0.002385169267654419,0.9999915361404419,0.003944873809814453,0.0012125223875045776,0.9999915957450867,0.003944873809814453,0.0012125223875045776,0.9999915957450867,0.9199705719947815,0.298895001411438,0.25360581278800964],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.23704378306865692,0.023000359535217285,0.2962978482246399,0.4792518615722656,0.5050051212310791,0.2502303123474121,0.22790862619876862,0.021942079067230225,0.2874794006347656,0.4803285002708435,0.017633967101573944,0.6739451289176941,0.20161525905132294,0.1155695915222168,0.21026334166526794,0.11554199457168579,0.23612302541732788,0.3868170976638794,0.6741329431533813,0.48301517963409424,0.22747491300106049,0.3868447542190552,0.17478206753730774,0.5167970061302185,0.2012992650270462,0.3867114782333374,0.2101074755191803,0.38673484325408936,0.17778971791267395,0.4792518615722656,0.20069445669651031,0.47938668727874756,0.2504180371761322,0.5048181414604187,0.16897115111351013,0.4803285002708435,0.20982962846755981,0.4804449677467346,0.17686891555786133,0.38681697845458984,0.3260548710823059,0.5167969465255737,0.16822080314159393,0.3868447542190552,0.1423611342906952,0.11557012796401978,0.9825537800788879,0.32586705684661865,0.1510092318058014,0.11554241180419922,0.17778971791267395,0.02300053834915161,0.3555530905723572,0.4792248010635376,0.4951818287372589,0.7495819330215454,0.16865456104278564,0.021942198276519775,0.34673523902893066,0.480310320854187,0.3197054862976074,0.29629039764404297,0.9477878212928772,0.1063617467880249,0.32840070128440857,0.2962949275970459,0.35455501079559326,0.2964339256286621,0.4484367072582245,0.8934502601623535,0.34586313366889954,0.29642730951309204,0.31974896788597107,0.20592015981674194,0.8936383128166199,0.0522121787071228,0.32843995094299316,0.20592659711837769,0.32605481147766113,0.9823660254478455,0.3545942008495331,0.11562323570251465,0.34578996896743774,0.1155862808227539,0.2962978482246399,0.023000359535217285,0.3192167282104492,0.023042798042297363,0.7497690320014954,0.0054662227630615234,0.287162721157074,0.021942138671875,0.32804927229881287,0.022000432014465332,0.2504180371761322,0.9943457245826721,0.25994858145713806,0.02313518524169922,0.3555530905723572,0.023087799549102783,0.2687670588493347,0.022058546543121338,0.3464353084564209,0.021996140480041504,0.295693039894104,0.11567586660385132,0.6741330623626709,0.017446041107177734,0.2868848443031311,0.11565232276916504,0.2953770160675049,0.3868170976638794,0.5169848203659058,0.17459428310394287,0.28672900795936584,0.3868447542190552,0.2364388257265091,0.11567533016204834,0.5169847011566162,0.32586705684661865,0.22763070464134216,0.11565178632736206,0.2276650071144104,0.20608502626419067,0.23635976016521454,0.20609813928604126,0.5517510175704956,0.39409929513931274,0.23622643947601318,0.2964661121368408,0.6059006452560425,0.44824880361557007,0.22753484547138214,0.2964508533477783,0.1414402574300766,0.47938668727874756,0.23704378306865692,0.4792518615722656,0.7497687339782715,0.49499499797821045,0.15057551860809326,0.4804449677467346,0.2282252460718155,0.4803285002708435,0.15085339546203613,0.38673484325408936,0.14204517006874084,0.38671135902404785,0.8254057765007019,0.48301517963409424,0.14212429523468018,0.29628849029541016,0.893638014793396,0.4482489228248596,0.15081912279129028,0.2963016629219055,0.1422577202320099,0.20592069625854492,0.9477876424789429,0.39409929513931274,0.15094926953315735,0.20593607425689697,0.14144045114517212,0.02313530445098877,0.31920260190963745,0.4793957471847534,0.9945327043533325,0.2502301335334778,0.15025892853736877,0.02205866575241089,0.3283390998840332,0.4804449677467346,0.31971582770347595,0.38671642541885376,0.9825538992881775,0.17459410429000854,0.32852432131767273,0.38673120737075806,0.31976577639579773,0.11558306217193604,0.8254058957099915,0.017445921897888184,0.3284158408641815,0.11556941270828247,0.29561394453048706,0.2060987949371338,0.6059007048606873,0.05221235752105713,0.28691911697387695,0.2060856819152832,0.29548054933547974,0.2964667081832886,0.5517511963844299,0.1063617467880249,0.2867889404296875,0.29645150899887085,0.005654247011989355,0.749582052230835,0.20069456100463867,0.02313518524169922,0.25994864106178284,0.47938668727874756,0.20951306819915771,0.022058427333831787,0.26908373832702637,0.4804449677467346,0.05240018665790558,0.605712890625,0.20151172578334808,0.2059200406074524,0.21020328998565674,0.2059352993965149,0.10654976963996887,0.5515632033348083,0.2013782411813736,0.2962881922721863,0.2100730687379837,0.29630136489868164,0.17697232961654663,0.29646652936935425,0.39428722858428955,0.5515631437301636,0.16828079521656036,0.2964513301849365,0.1684110462665558,0.20608550310134888,0.17710581421852112,0.206098735332489,0.44843676686286926,0.6057127714157104,0.1771848499774933,0.11567568778991699,0.4832030236721039,0.6739450693130493,0.168376624584198,0.11565232276916504,0.3545408844947815,0.38678765296936035,0.4832029938697815,0.8252179622650146,0.3458925485610962,0.3868238925933838,0.35459887981414795,0.20606255531311035,0.3942871689796448,0.9475997686386108,0.34590303897857666,0.2060578465461731,0.17478202283382416,0.9823660254478455,0.2608692944049835,0.11557012796401978,0.2695173919200897,0.11554241180419922,0.10654974728822708,0.9475998282432556,0.26076579093933105,0.20592081546783447,0.2694574296474457,0.20593613386154175,0.2693272829055786,0.29630184173583984,0.05240019038319588,0.8934502601623535,0.2606324851512909,0.2962886691093445,0.0176339503377676,0.8252179622650146,0.26055341958999634,0.3867114782333374,0.2693616449832916,0.38673484325408936],\n \"normalized\": false\n },\n \"color\": {\n \"itemSize\": 4,\n \"type\": \"Uint16Array\",\n \"array\": [65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535],\n \"normalized\": true\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [35,38,32,129,54,126,123,91,38,130,57,97,18,10,13,21,77,72,120,32,88,17,72,70,27,20,103,105,60,7,130,94,129,126,45,50,28,24,117,13,66,108,117,80,112,29,88,85,111,80,77,41,46,91,108,61,105,135,4,57,76,87,44,38,30,32,54,42,45,72,67,70,77,78,75,94,95,92,104,108,105,113,117,112,125,129,126,134,130,132,113,111,109,15,13,12,14,21,17,49,41,40,61,58,60,61,64,62,77,73,72,88,82,85,135,100,102,132,129,128,60,0,3,66,8,64,10,68,8,80,22,78,24,81,22,32,86,88,38,89,36,91,43,89,94,52,54,57,95,97,57,1,55,6,105,7,19,111,21,26,120,29,12,108,107,48,126,50,25,117,115,118,35,120,40,123,121,99,7,101,121,35,33,7,3,101,35,123,38,129,94,54,123,41,91,130,135,57,18,71,10,21,111,77,120,35,32,17,21,72,103,5,131,5,98,131,98,133,131,131,127,124,124,47,131,47,39,131,39,122,27,122,34,27,34,119,27,27,116,114,114,110,20,20,16,103,16,11,103,11,106,103,27,114,20,103,131,39,39,27,103,105,61,60,130,97,94,126,54,45,28,84,24,13,10,66,117,24,80,29,120,88,111,112,80,41,51,46,108,66,61,135,102,4,56,2,65,2,59,65,59,63,65,65,9,69,69,74,76,76,79,87,79,23,87,23,83,87,87,31,37,37,90,44,44,53,93,93,96,44,96,56,44,65,69,76,87,37,44,56,65,44,65,76,44,38,36,30,54,52,42,72,73,67,77,80,78,94,97,95,104,107,108,113,115,117,125,128,129,134,135,130,113,112,111,15,18,13,14,19,21,49,51,41,61,62,58,61,66,64,77,75,73,88,86,82,135,134,100,132,130,129,60,58,0,66,10,8,10,71,68,80,24,22,24,84,81,32,30,86,38,91,89,91,46,43,94,92,52,57,55,95,57,4,1,6,104,105,19,109,111,26,118,120,12,13,108,48,125,126,25,28,117,118,33,35,40,41,123,99,6,7,121,123,35,7,60,3]\n },\n \"boundingSphere\": {\n \"center\": [0,0,0],\n \"radius\": 128.54241934554352\n }\n },\n faceValues: [0, 0, 0, 0, 0, 0, 0, 0, 2, 1],\n rotationCombinations: {\n \"1,2\": [180, 0, 0]\n }\n },\n \"d4\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"C5380F7D-1CC8-4744-8B30-2399F5490F2A\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-67.64075469970703, -67.64099884033203, 65.7880630493164, -67.64075469970703, -67.64099884033203, 65.7880630493164, -67.64075469970703, -67.64099884033203, 65.7880630493164, 67.64124298095703, 65.7878189086914, 67.6407470703125, 67.64124298095703, 65.7878189086914, 67.6407470703125, 67.64124298095703, 65.7878189086914, 67.6407470703125, 65.7880630493164, 67.64099884033203, 67.64075469970703, 65.7880630493164, 67.64099884033203, 67.64075469970703, -67.6412353515625, 67.64099884033203, -65.78756713867188, -67.6412353515625, 67.64099884033203, -65.78756713867188, -67.6407470703125, -65.7878189086914, 67.64124298095703, -67.6407470703125, -65.7878189086914, 67.64124298095703, 67.6412353515625, 67.64099884033203, 65.78756713867188, 67.6412353515625, 67.64099884033203, 65.78756713867188, 67.6412353515625, 67.64099884033203, 65.78756713867188, 67.64075469970703, -67.64099884033203, -65.7880630493164, 67.64075469970703, -67.64099884033203, -65.7880630493164, 67.6407470703125, -65.7878189086914, -67.64124298095703, 67.6407470703125, -65.7878189086914, -67.64124298095703, 65.78756713867188, -67.64099884033203, -67.6412353515625, 65.78756713867188, -67.64099884033203, -67.6412353515625, -65.78756713867188, -67.64099884033203, 67.6412353515625, -65.78756713867188, -67.64099884033203, 67.6412353515625, -65.78756713867188, -67.64099884033203, 67.6412353515625, -65.7880630493164, 67.64099884033203, -67.64075469970703, -65.7880630493164, 67.64099884033203, -67.64075469970703, -65.7880630493164, 67.64099884033203, -67.64075469970703, -67.64124298095703, 65.7878189086914, -67.6407470703125, -67.64124298095703, 65.7878189086914, -67.6407470703125, -67.64124298095703, 65.7878189086914, -67.6407470703125],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-0.5875354409217834, -0.5875733494758606, -0.5563808679580688, -0.5875354409217834, -0.5875733494758606, -0.5563808679580688, -0.5875354409217834, -0.5875733494758606, -0.5563808679580688, 0.58754962682724, -0.5564354062080383, 0.5875076055526733, 0.58754962682724, -0.5564354062080383, 0.5875076055526733, 0.58754962682724, -0.5564354062080383, 0.5875076055526733, -0.5564345121383667, 0.5875091552734375, 0.5875489711761475, -0.5564345121383667, 0.5875091552734375, 0.5875489711761475, -0.5875074863433838, 0.5875474810600281, 0.5564377903938293, -0.5875074863433838, 0.5875474810600281, 0.5564377903938293, -0.5875458717346191, 0.5564350485801697, 0.5875116586685181, -0.5875458717346191, 0.5564350485801697, 0.5875116586685181, 0.5875073075294495, 0.5875475406646729, -0.5564377903938293, 0.5875073075294495, 0.5875475406646729, -0.5564377903938293, 0.5875073075294495, 0.5875475406646729, -0.5564377903938293, 0.5875356793403625, -0.5875731706619263, 0.5563808679580688, 0.5875356793403625, -0.5875731706619263, 0.5563808679580688, 0.5875458717346191, 0.5564350485801697, -0.5875116586685181, 0.5875458717346191, 0.5564350485801697, -0.5875116586685181, -0.5564398169517517, -0.5875092148780823, -0.5875437259674072, -0.5564398169517517, -0.5875092148780823, -0.5875437259674072, 0.5564400553703308, -0.5875090956687927, 0.5875436663627625, 0.5564400553703308, -0.5875090956687927, 0.5875436663627625, 0.5564400553703308, -0.5875090956687927, 0.5875436663627625, 0.5564344525337219, 0.587509036064148, -0.587549090385437, 0.5564344525337219, 0.587509036064148, -0.587549090385437, 0.5564344525337219, 0.587509036064148, -0.587549090385437, -0.5875496864318848, -0.5564355850219727, -0.5875071883201599, -0.5875496864318848, -0.5564355850219727, -0.5875071883201599, -0.5875496864318848, -0.5564355850219727, -0.5875071883201599],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.20333926379680634, 0.01598501205444336, 0.20718662440776825, 0.23812401294708252, 0.5022410154342651, 0.21281301975250244, 0.20517542958259583, 0.22700607776641846, 0.21218715608119965, 0.009441137313842773, 0.6251919865608215, 0.25002896785736084, 0.12502600252628326, 0.24997997283935547, 0.2080860435962677, 0.01124197244644165, 0.0021929999347776175, 0.4627319574356079, 0.015251883305609226, 0.12210333347320557, 0.2076776623725891, 0.23367196321487427, 0.24785800278186798, 0.4627319574356079, 0.20334681868553162, 0.22807049751281738, 0.20728397369384766, 0.00649791955947876, 0.49776899814605713, 0.46269500255584717, 0.14456242322921753, 0.12202131748199463, 0.7480239868164062, 0.46278202533721924, 0.14273378252983093, 0.12308567762374878, 0.3749360144138336, 0.24994301795959473, 0.14272625744342804, 0.12096989154815674, 0.625074028968811, 0.00006097555160522461, 0.20517542958259583, 0.0170363187789917, 0.21218715608119965, 0.23534929752349854, 0.5023589730262756, 0.46278202533721924, 0.011641831137239933, 0.11945211887359619, 0.021507836878299713, 0.12308526039123535, 0.2521030008792877, 0.46269500255584717, 0.011544500477612019, 0.12516993284225464, 0.021500281989574432, 0.12096947431564331, 0.7479060292243958, 0.21281301975250244],\n \"normalized\": false\n },\n \"color\": {\n \"itemSize\": 4,\n \"type\": \"Uint16Array\",\n \"array\": [65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535],\n \"normalized\": true\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [6, 8, 11, 26, 14, 18, 29, 20, 2, 5, 23, 16, 17, 3, 15, 25, 19, 28, 10, 27, 1, 0, 15, 21, 9, 13, 24, 9, 24, 27, 7, 4, 13, 10, 1, 22, 17, 15, 19, 7, 22, 4, 17, 12, 3, 25, 17, 19, 10, 9, 27, 0, 19, 15, 9, 7, 13, 7, 10, 22]\n },\n \"boundingSphere\": {\n \"center\": [0, 0, 0],\n \"radius\": 117.1579285756433\n }\n },\n faceValues: [2, 4, 3, 1],\n rotationCombinations: {\n \"1,2\": [90, 0, 90],\n \"1,3\": [120, 90, 150],\n \"1,4\": [-180, 0, -180],\n \"2,3\": [90, 0, 90],\n \"2,4\": [-90, 0, -90],\n \"3,4\": [-90, 0, 90]\n }\n },\n \"d6\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"E18C9F5C-7D15-4FF3-AC5E-A4A56A405499\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [52.081398010253906, -49.99797058105469, 49.997779846191406, 52.081398010253906, -49.99797058105469, 49.997779846191406, 52.081398010253906, -49.99797058105469, 49.997779846191406, 52.081398010253906, -49.99797058105469, 49.997779846191406, 52.081031799316406, 49.99797058105469, -49.99816131591797, 52.081031799316406, 49.99797058105469, -49.99816131591797, 52.081031799316406, 49.99797058105469, -49.99816131591797, 52.081031799316406, 49.99797058105469, -49.99816131591797, 52.081398010253906, 49.99797058105469, 49.997779846191406, 52.081398010253906, 49.99797058105469, 49.997779846191406, 52.081398010253906, 49.99797058105469, 49.997779846191406, 52.081398010253906, 49.99797058105469, 49.997779846191406, -52.081031799316406, 49.99797058105469, 49.99816131591797, -52.081031799316406, 49.99797058105469, 49.99816131591797, -52.081031799316406, 49.99797058105469, 49.99816131591797, -52.081031799316406, 49.99797058105469, 49.99816131591797, 49.99778747558594, 52.081214904785156, -49.99814987182617, 49.99778747558594, 52.081214904785156, -49.99814987182617, 49.99778747558594, 52.081214904785156, -49.99814987182617, 49.99778747558594, 52.081214904785156, -49.99814987182617, -49.99814987182617, -52.081214904785156, -49.99778747558594, -49.99814987182617, -52.081214904785156, -49.99778747558594, -49.99814987182617, -52.081214904785156, -49.99778747558594, -49.99814987182617, -52.081214904785156, -49.99778747558594, -49.99816131591797, -49.99797058105469, -52.081031799316406, -49.99816131591797, -49.99797058105469, -52.081031799316406, -49.99816131591797, -49.99797058105469, -52.081031799316406, -49.99816131591797, -49.99797058105469, -52.081031799316406, 49.99778747558594, -52.081214904785156, -49.99814987182617, 49.99778747558594, -52.081214904785156, -49.99814987182617, 49.99778747558594, -52.081214904785156, -49.99814987182617, 49.99778747558594, -52.081214904785156, -49.99814987182617, -49.99778747558594, -52.081214904785156, 49.99814987182617, -49.99778747558594, -52.081214904785156, 49.99814987182617, -49.99778747558594, -52.081214904785156, 49.99814987182617, -49.99778747558594, -52.081214904785156, 49.99814987182617, 52.081031799316406, -49.99797058105469, -49.99816131591797, 52.081031799316406, -49.99797058105469, -49.99816131591797, 52.081031799316406, -49.99797058105469, -49.99816131591797, 52.081031799316406, -49.99797058105469, -49.99816131591797, 49.997779846191406, -49.99797058105469, -52.081398010253906, 49.997779846191406, -49.99797058105469, -52.081398010253906, 49.997779846191406, -49.99797058105469, -52.081398010253906, 49.997779846191406, -49.99797058105469, -52.081398010253906, -52.081398010253906, -49.99797058105469, -49.997779846191406, -52.081398010253906, -49.99797058105469, -49.997779846191406, -52.081398010253906, -49.99797058105469, -49.997779846191406, -52.081398010253906, -49.99797058105469, -49.997779846191406, -49.99814987182617, 52.081214904785156, -49.99778747558594, -49.99814987182617, 52.081214904785156, -49.99778747558594, -49.99814987182617, 52.081214904785156, -49.99778747558594, -49.99814987182617, 52.081214904785156, -49.99778747558594, 49.99814987182617, 52.081214904785156, 49.99778747558594, 49.99814987182617, 52.081214904785156, 49.99778747558594, 49.99814987182617, 52.081214904785156, 49.99778747558594, 49.99814987182617, 52.081214904785156, 49.99778747558594, -49.997779846191406, -49.99797058105469, 52.081398010253906, -49.997779846191406, -49.99797058105469, 52.081398010253906, -49.997779846191406, -49.99797058105469, 52.081398010253906, -49.997779846191406, -49.99797058105469, 52.081398010253906, -49.99778747558594, 52.081214904785156, 49.99814987182617, -49.99778747558594, 52.081214904785156, 49.99814987182617, -49.99778747558594, 52.081214904785156, 49.99814987182617, -49.99778747558594, 52.081214904785156, 49.99814987182617, 49.99816131591797, 49.99797058105469, 52.081031799316406, 49.99816131591797, 49.99797058105469, 52.081031799316406, 49.99816131591797, 49.99797058105469, 52.081031799316406, 49.99816131591797, 49.99797058105469, 52.081031799316406, 49.99814987182617, -52.081214904785156, 49.99778747558594, 49.99814987182617, -52.081214904785156, 49.99778747558594, 49.99814987182617, -52.081214904785156, 49.99778747558594, 49.99814987182617, -52.081214904785156, 49.99778747558594, 49.99816131591797, -49.99797058105469, 52.081031799316406, 49.99816131591797, -49.99797058105469, 52.081031799316406, 49.99816131591797, -49.99797058105469, 52.081031799316406, 49.99816131591797, -49.99797058105469, 52.081031799316406, -52.081031799316406, -49.99797058105469, 49.99816131591797, -52.081031799316406, -49.99797058105469, 49.99816131591797, -52.081031799316406, -49.99797058105469, 49.99816131591797, -52.081031799316406, -49.99797058105469, 49.99816131591797, 49.997779846191406, 49.99797058105469, -52.081398010253906, 49.997779846191406, 49.99797058105469, -52.081398010253906, 49.997779846191406, 49.99797058105469, -52.081398010253906, 49.997779846191406, 49.99797058105469, -52.081398010253906, -49.99816131591797, 49.99797058105469, -52.081031799316406, -49.99816131591797, 49.99797058105469, -52.081031799316406, -49.99816131591797, 49.99797058105469, -52.081031799316406, -49.99816131591797, 49.99797058105469, -52.081031799316406, -52.081398010253906, 49.99797058105469, -49.997779846191406, -52.081398010253906, 49.99797058105469, -49.997779846191406, -52.081398010253906, 49.99797058105469, -49.997779846191406, -52.081398010253906, 49.99797058105469, -49.997779846191406, -49.997779846191406, 49.99797058105469, 52.081398010253906, -49.997779846191406, 49.99797058105469, 52.081398010253906, -49.997779846191406, 49.99797058105469, 52.081398010253906, -49.997779846191406, 49.99797058105469, 52.081398010253906],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [0.9995923042297363, -0.020230919122695923, 0.020147494971752167, 0.9995923042297363, -0.020230919122695923, 0.020147494971752167, 0.9995923042297363, -0.020230919122695923, 0.020147494971752167, 0.9995923042297363, -0.020230919122695923, 0.020147494971752167, 0.9995908737182617, 0.02024438977241516, -0.020207354798913002, 0.9995908737182617, 0.02024438977241516, -0.020207354798913002, 0.9995908737182617, 0.02024438977241516, -0.020207354798913002, 0.9995908737182617, 0.02024438977241516, -0.020207354798913002, 0.9995913505554199, 0.020214110612869263, 0.020209431648254395, 0.9995913505554199, 0.020214110612869263, 0.020209431648254395, 0.9995913505554199, 0.020214110612869263, 0.020209431648254395, 0.9995913505554199, 0.020214110612869263, 0.020209431648254395, -0.9995912313461304, 0.020234376192092896, 0.020197225734591484, -0.9995912313461304, 0.020234376192092896, 0.020197225734591484, -0.9995912313461304, 0.020234376192092896, 0.020197225734591484, -0.9995912313461304, 0.020234376192092896, 0.020197225734591484, 0.02019399404525757, 0.9995913505554199, -0.02023378014564514, 0.02019399404525757, 0.9995913505554199, -0.02023378014564514, 0.02019399404525757, 0.9995913505554199, -0.02023378014564514, 0.02019399404525757, 0.9995913505554199, -0.02023378014564514, -0.02023431658744812, -0.9995909333229065, -0.020213313400745392, -0.02023431658744812, -0.9995909333229065, -0.020213313400745392, -0.02023431658744812, -0.9995909333229065, -0.020213313400745392, -0.02023431658744812, -0.9995909333229065, -0.020213313400745392, -0.02021673321723938, -0.02017366886138916, -0.9995919466018677, -0.02021673321723938, -0.02017366886138916, -0.9995919466018677, -0.02021673321723938, -0.02017366886138916, -0.9995919466018677, -0.02021673321723938, -0.02017366886138916, -0.9995919466018677, 0.020203232765197754, -0.9995912909507751, -0.020224466919898987, 0.020203232765197754, -0.9995912909507751, -0.020224466919898987, 0.020203232765197754, -0.9995912909507751, -0.020224466919898987, 0.020203232765197754, -0.9995912909507751, -0.020224466919898987, -0.020203210413455963, -0.9995913505554199, 0.02022451162338257, -0.020203210413455963, -0.9995913505554199, 0.02022451162338257, -0.020203210413455963, -0.9995913505554199, 0.02022451162338257, -0.020203210413455963, -0.9995913505554199, 0.02022451162338257, 0.9995921850204468, -0.020173730328679085, -0.020216643810272217, 0.9995921850204468, -0.020173730328679085, -0.020216643810272217, 0.9995921850204468, -0.020173730328679085, -0.020216643810272217, 0.9995921850204468, -0.020173730328679085, -0.020216643810272217, 0.020147576928138733, -0.020230591297149658, -0.9995923042297363, 0.020147576928138733, -0.020230591297149658, -0.9995923042297363, 0.020147576928138733, -0.020230591297149658, -0.9995923042297363, 0.020147576928138733, -0.020230591297149658, -0.9995923042297363, -0.9995916485786438, -0.020208656787872314, -0.020204007625579834, -0.9995916485786438, -0.020208656787872314, -0.020204007625579834, -0.9995916485786438, -0.020208656787872314, -0.020204007625579834, -0.9995916485786438, -0.020208656787872314, -0.020204007625579834, -0.02024361491203308, 0.9995908737182617, -0.02020406536757946, -0.02024361491203308, 0.9995908737182617, -0.02020406536757946, -0.02024361491203308, 0.9995908737182617, -0.02020406536757946, -0.02024361491203308, 0.9995908737182617, -0.02020406536757946, 0.02026575803756714, 0.9995908141136169, 0.020181983709335327, 0.02026575803756714, 0.9995908141136169, 0.020181983709335327, 0.02026575803756714, 0.9995908141136169, 0.020181983709335327, 0.02026575803756714, 0.9995908141136169, 0.020181983709335327, -0.020204126834869385, -0.020208358764648438, 0.9995917081832886, -0.020204126834869385, -0.020208358764648438, 0.9995917081832886, -0.020204126834869385, -0.020208358764648438, 0.9995917081832886, -0.020204126834869385, -0.020208358764648438, 0.9995917081832886, -0.02021375298500061, 0.9995914101600647, 0.020213931798934937, -0.02021375298500061, 0.9995914101600647, 0.020213931798934937, -0.02021375298500061, 0.9995914101600647, 0.020213931798934937, -0.02021375298500061, 0.9995914101600647, 0.020213931798934937, 0.020197970792651176, 0.020234346389770508, 0.9995912313461304, 0.020197970792651176, 0.020234346389770508, 0.9995912313461304, 0.020197970792651176, 0.020234346389770508, 0.9995912313461304, 0.020197970792651176, 0.020234346389770508, 0.9995912313461304, 0.02023431658744812, -0.9995909333229065, 0.020213313400745392, 0.02023431658744812, -0.9995909333229065, 0.020213313400745392, 0.02023431658744812, -0.9995909333229065, 0.020213313400745392, 0.02023431658744812, -0.9995909333229065, 0.020213313400745392, 0.020256830379366875, -0.020169764757156372, 0.9995912909507751, 0.020256830379366875, -0.020169764757156372, 0.9995912909507751, 0.020256830379366875, -0.020169764757156372, 0.9995912909507751, 0.020256830379366875, -0.020169764757156372, 0.9995912909507751, -0.9995914101600647, -0.02016991376876831, 0.020256860181689262, -0.9995914101600647, -0.02016991376876831, 0.020256860181689262, -0.9995914101600647, -0.02016991376876831, 0.020256860181689262, -0.9995914101600647, -0.02016991376876831, 0.020256860181689262, 0.02021026611328125, 0.020213961601257324, -0.9995913505554199, 0.02021026611328125, 0.020213961601257324, -0.9995913505554199, 0.02021026611328125, 0.020213961601257324, -0.9995913505554199, 0.02021026611328125, 0.020213961601257324, -0.9995913505554199, -0.02020804025232792, 0.020244628190994263, -0.9995906949043274, -0.02020804025232792, 0.020244628190994263, -0.9995906949043274, -0.02020804025232792, 0.020244628190994263, -0.9995906949043274, -0.02020804025232792, 0.020244628190994263, -0.9995906949043274, -0.9995908737182617, 0.020204482600092888, -0.020239561796188354, -0.9995908737182617, 0.020204482600092888, -0.020239561796188354, -0.9995908737182617, 0.020204482600092888, -0.020239561796188354, -0.9995908737182617, 0.020204482600092888, -0.020239561796188354, -0.020240217447280884, 0.020204216241836548, 0.9995909929275513, -0.020240217447280884, 0.020204216241836548, 0.9995909929275513, -0.020240217447280884, 0.020204216241836548, 0.9995909929275513, -0.020240217447280884, 0.020204216241836548, 0.9995909929275513],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.002862999914214015, 0.7471370100975037, 0.07257817685604095, 0.00783926248550415, 0.20479217171669006, 0.24324274063110352, 0.23563209176063538, 0.18311190605163574, 0.16701677441596985, 0.007843196392059326, 0.21674437820911407, 0.007843255996704102, 0.23563209176063538, 0.23977500200271606, 0.24713699519634247, 0.5028629899024963, 0.002862999914214015, 0.5028629899024963, 0.16701683402061462, 0.24324274063110352, 0.20479217171669006, 0.007843196392059326, 0.2416384220123291, 0.12991642951965332, 0.12230584025382996, 0.24324274063110352, 0.14119352400302887, 0.007843255996704102, 0.24163848161697388, 0.2243550419807434, 0.2481130063533783, 0.4981130361557007, 0.11035363376140594, 0.007843255996704102, 0.16008129715919495, 0.007843196392059326, 0.2416384220123291, 0.23630714416503906, 0.4975059926509857, 0.7470999956130981, 0.008979067206382751, 0.00783926248550415, 0.02786727249622345, 0.24324274063110352, 0.2416384220123291, 0.20546722412109375, 0.7475240230560303, 0.002879023551940918, 0.034802429378032684, 0.24324274063110352, 0.08453041315078735, 0.24324274063110352, 0.23563209176063538, 0.20199954509735107, 0.4974119961261749, 0.49670398235321045, 0.027866892516613007, 0.00783926248550415, 0.06564302742481232, 0.24324274063110352, 0.2416384220123291, 0.1607564091682434, 0.5032510161399841, 0.002879023551940918, 0.008979566395282745, 0.24324274063110352, 0.046754732728004456, 0.00783926248550415, 0.2416384220123291, 0.11102879047393799, 0.7475240230560303, 0.24715197086334229, 0.07257817685604095, 0.24324274063110352, 0.21674437820911407, 0.24324274063110352, 0.2416384220123291, 0.1676918864250183, 0.24713699519634247, 0.7471370100975037, 0.03480251133441925, 0.00783926248550415, 0.22367990016937256, 0.24324274063110352, 0.23563209176063538, 0.16422414779663086, 0.2531389892101288, 0.49670398235321045, 0.0038399999029934406, 0.25383996963500977, 0.015914686024188995, 0.00783926248550415, 0.09146587550640106, 0.24324274063110352, 0.2416384220123291, 0.19853174686431885, 0.11035363376140594, 0.24324274063110352, 0.12924134731292725, 0.007843255996704102, 0.2416384220123291, 0.1488041877746582, 0.4975059926509857, 0.5028259754180908, 0.16008129715919495, 0.24324274063110352, 0.17896901071071625, 0.007843196392059326, 0.2416384220123291, 0.12298095226287842, 0.2532320022583008, 0.7470999956130981, 0.0536903440952301, 0.00783926248550415, 0.14812909066677094, 0.24324274063110352, 0.2416384220123291, 0.10409331321716309, 0.5033630132675171, 0.252979040145874, 0.12924134731292725, 0.24324274063110352, 0.17896901071071625, 0.24324274063110352, 0.23563209176063538, 0.22088712453842163, 0.2532320022583008, 0.5028259754180908, 0.18590447306632996, 0.007843196392059326, 0.19785669445991516, 0.007843196392059326, 0.23563209176063538, 0.12644875049591064, 0.7476369738578796, 0.4972519874572754, 0.046755194664001465, 0.24324274063110352, 0.06564256548881531, 0.00783926248550415, 0.2416384220123291, 0.17964410781860352, 0.5032510161399841, 0.24715197086334229, 0.0536903440952301, 0.24324274063110352, 0.19785669445991516, 0.24324274063110352, 0.2416384220123291, 0.18657952547073364, 0.5033630132675171, 0.4972519874572754, 0.0038399999029934406, 0.4981130361557007, 0.015914715826511383, 0.24324274063110352, 0.14119356870651245, 0.24324274063110352, 0.23563209176063538, 0.10756111145019531, 0.10341811925172806, 0.007843255996704102, 0.22367990016937256, 0.007843255996704102, 0.2416384220123291, 0.24324274063110352, 0.2531389892101288, 0.2524310350418091, 0.08453038334846497, 0.007843196392059326, 0.10341812670230865, 0.24324274063110352, 0.2416384220123291, 0.14186859130859375, 0.4974119961261749, 0.2524310350418091, 0.09146586060523987, 0.007843196392059326, 0.12230582535266876, 0.007843255996704102, 0.23563209176063538, 0.14533644914627075, 0.2481130063533783, 0.25383996963500977, 0.14812903106212616, 0.007843255996704102, 0.18590447306632996, 0.24324274063110352, 0.24163848161697388, 0.21741944551467896, 0.7476369738578796, 0.252979040145874],\n \"normalized\": false\n },\n \"color\": {\n \"itemSize\": 4,\n \"type\": \"Uint16Array\",\n \"array\": [65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535],\n \"normalized\": true\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [83, 27, 87, 8, 39, 7, 44, 15, 91, 59, 67, 95, 63, 19, 51, 13, 57, 92, 1, 29, 36, 56, 68, 72, 40, 21, 24, 80, 48, 16, 45, 32, 77, 41, 5, 37, 89, 60, 49, 84, 46, 88, 2, 65, 73, 93, 53, 61, 9, 17, 52, 70, 3, 74, 30, 42, 38, 22, 47, 26, 34, 58, 79, 11, 54, 66, 82, 18, 6, 86, 90, 50, 14, 94, 62, 31, 35, 23, 83, 43, 27, 8, 0, 39, 44, 76, 15, 59, 75, 67, 63, 55, 19, 13, 78, 57, 1, 69, 29, 56, 33, 68, 40, 28, 21, 80, 85, 48, 45, 20, 32, 41, 81, 5, 89, 12, 60, 84, 25, 46, 2, 10, 65, 93, 64, 53, 9, 4, 17, 31, 71, 35]\n },\n \"boundingSphere\": {\n \"center\": [0, 0, 0],\n \"radius\": 90.20752176710862\n }\n },\n faceValues: [3, 5, 1, 6, 2, 4],\n rotationCombinations: {\n \"1,2\": [0, 0, 90],\n \"1,3\": [-90, 0, 0],\n \"1,4\": [90, 0, 0],\n \"1,5\": [0, 0, -90],\n \"1,6\": [180, 0, 0],\n \"2,3\": [0, 90, 0],\n \"2,4\": [0, -90, 0],\n \"2,5\": [0, 0, 180],\n \"2,6\": [0, 0, 90],\n \"3,4\": [-180, 0, -180],\n \"3,5\": [0, 90, 0],\n \"3,6\": [-90, 0, 0],\n \"4,5\": [180, -90, 180],\n \"4,6\": [90, 0, 0],\n \"5,6\": [0, 0, -90]\n }\n },\n \"d8\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"F0A476BC-C144-4BC6-A327-5E00064C485A\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-1.1684173345565796, 1.168058156967163, -97.7831802368164, -1.1684173345565796, 1.168058156967163, -97.7831802368164, -1.1684173345565796, 1.168058156967163, -97.7831802368164, -1.1684173345565796, 1.168058156967163, -97.7831802368164, -97.7831802368164, 1.168058156967163, 1.1684173345565796, -97.7831802368164, 1.168058156967163, 1.1684173345565796, -97.7831802368164, 1.168058156967163, 1.1684173345565796, -97.7831802368164, 1.168058156967163, 1.1684173345565796, -1.167698860168457, -1.168058156967163, 97.7831802368164, -1.167698860168457, -1.168058156967163, 97.7831802368164, -1.167698860168457, -1.168058156967163, 97.7831802368164, -1.167698860168457, -1.168058156967163, 97.7831802368164, -97.7831802368164, -1.168058156967163, 1.1684173345565796, -97.7831802368164, -1.168058156967163, 1.1684173345565796, -97.7831802368164, -1.168058156967163, 1.1684173345565796, -97.7831802368164, -1.168058156967163, 1.1684173345565796, -1.1680537462234497, 97.7831802368164, 1.168062448501587, -1.1680537462234497, 97.7831802368164, 1.168062448501587, -1.1680537462234497, 97.7831802368164, 1.168062448501587, -1.1680537462234497, 97.7831802368164, 1.168062448501587, -97.7831802368164, 1.168058156967163, -1.167698860168457, -97.7831802368164, 1.168058156967163, -1.167698860168457, -97.7831802368164, 1.168058156967163, -1.167698860168457, -97.7831802368164, 1.168058156967163, -1.167698860168457, -1.168062448501587, 97.7831802368164, -1.1680537462234497, -1.168062448501587, 97.7831802368164, -1.1680537462234497, -1.168062448501587, 97.7831802368164, -1.1680537462234497, -1.168062448501587, 97.7831802368164, -1.1680537462234497, 97.7831802368164, -1.168058156967163, -1.1684173345565796, 97.7831802368164, -1.168058156967163, -1.1684173345565796, 97.7831802368164, -1.168058156967163, -1.1684173345565796, 97.7831802368164, -1.168058156967163, -1.1684173345565796, 1.167698860168457, -1.168058156967163, -97.7831802368164, 1.167698860168457, -1.168058156967163, -97.7831802368164, 1.167698860168457, -1.168058156967163, -97.7831802368164, 1.167698860168457, -1.168058156967163, -97.7831802368164, 1.167698860168457, 1.168058156967163, -97.7831802368164, 1.167698860168457, 1.168058156967163, -97.7831802368164, 1.167698860168457, 1.168058156967163, -97.7831802368164, 1.167698860168457, 1.168058156967163, -97.7831802368164, 1.1680537462234497, 97.7831802368164, -1.168062448501587, 1.1680537462234497, 97.7831802368164, -1.168062448501587, 1.1680537462234497, 97.7831802368164, -1.168062448501587, 1.1680537462234497, 97.7831802368164, -1.168062448501587, 97.7831802368164, 1.168058156967163, 1.167698860168457, 97.7831802368164, 1.168058156967163, 1.167698860168457, 97.7831802368164, 1.168058156967163, 1.167698860168457, 97.7831802368164, 1.168058156967163, 1.167698860168457, -1.168062448501587, -97.7831802368164, -1.1680537462234497, -1.168062448501587, -97.7831802368164, -1.1680537462234497, -1.168062448501587, -97.7831802368164, -1.1680537462234497, -1.168062448501587, -97.7831802368164, -1.1680537462234497, -97.7831802368164, -1.168058156967163, -1.167698860168457, -97.7831802368164, -1.168058156967163, -1.167698860168457, -97.7831802368164, -1.168058156967163, -1.167698860168457, -97.7831802368164, -1.168058156967163, -1.167698860168457, 97.7831802368164, -1.168058156967163, 1.167698860168457, 97.7831802368164, -1.168058156967163, 1.167698860168457, 97.7831802368164, -1.168058156967163, 1.167698860168457, 97.7831802368164, -1.168058156967163, 1.167698860168457, -1.167698860168457, 1.168058156967163, 97.7831802368164, -1.167698860168457, 1.168058156967163, 97.7831802368164, -1.167698860168457, 1.168058156967163, 97.7831802368164, -1.167698860168457, 1.168058156967163, 97.7831802368164, 1.168062448501587, -97.7831802368164, 1.1680537462234497, 1.168062448501587, -97.7831802368164, 1.1680537462234497, 1.168062448501587, -97.7831802368164, 1.1680537462234497, 1.168062448501587, -97.7831802368164, 1.1680537462234497, 1.1684173345565796, -1.168058156967163, 97.7831802368164, 1.1684173345565796, -1.168058156967163, 97.7831802368164, 1.1684173345565796, -1.168058156967163, 97.7831802368164, 1.1684173345565796, -1.168058156967163, 97.7831802368164, -1.1684173345565796, -1.168058156967163, -97.7831802368164, -1.1684173345565796, -1.168058156967163, -97.7831802368164, -1.1684173345565796, -1.168058156967163, -97.7831802368164, -1.1684173345565796, -1.168058156967163, -97.7831802368164, 1.1684173345565796, 1.168058156967163, 97.7831802368164, 1.1684173345565796, 1.168058156967163, 97.7831802368164, 1.1684173345565796, 1.168058156967163, 97.7831802368164, 1.1684173345565796, 1.168058156967163, 97.7831802368164, 97.7831802368164, 1.168058156967163, -1.1684173345565796, 97.7831802368164, 1.168058156967163, -1.1684173345565796, 97.7831802368164, 1.168058156967163, -1.1684173345565796, 97.7831802368164, 1.168058156967163, -1.1684173345565796, 1.168062448501587, 97.7831802368164, 1.1680537462234497, 1.168062448501587, 97.7831802368164, 1.1680537462234497, 1.168062448501587, 97.7831802368164, 1.1680537462234497, 1.168062448501587, 97.7831802368164, 1.1680537462234497, -1.1680537462234497, -97.7831802368164, 1.168062448501587, -1.1680537462234497, -97.7831802368164, 1.168062448501587, -1.1680537462234497, -97.7831802368164, 1.168062448501587, -1.1680537462234497, -97.7831802368164, 1.168062448501587, 1.1680537462234497, -97.7831802368164, -1.168062448501587, 1.1680537462234497, -97.7831802368164, -1.168062448501587, 1.1680537462234497, -97.7831802368164, -1.168062448501587, 1.1680537462234497, -97.7831802368164, -1.168062448501587],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-0.5682533383369446, 0.5682891607284546, -0.5950928330421448, -0.5682533383369446, 0.5682891607284546, -0.5950928330421448, -0.5682533383369446, 0.5682891607284546, -0.5950928330421448, -0.5682533383369446, 0.5682891607284546, -0.5950928330421448, -0.5951133966445923, 0.568278431892395, 0.5682425498962402, -0.5951133966445923, 0.568278431892395, 0.5682425498962402, -0.5951133966445923, 0.568278431892395, 0.5682425498962402, -0.5951133966445923, 0.568278431892395, 0.5682425498962402, -0.5682530999183655, -0.5682904720306396, 0.5950918197631836, -0.5682530999183655, -0.5682904720306396, 0.5950918197631836, -0.5682530999183655, -0.5682904720306396, 0.5950918197631836, -0.5682530999183655, -0.5682904720306396, 0.5950918197631836, -0.5950893759727478, -0.5682545304298401, 0.5682916045188904, -0.5950893759727478, -0.5682545304298401, 0.5682916045188904, -0.5950893759727478, -0.5682545304298401, 0.5682916045188904, -0.5950893759727478, -0.5682545304298401, 0.5682916045188904, -0.5682390332221985, 0.5951166152954102, 0.5682786107063293, -0.5682390332221985, 0.5951166152954102, 0.5682786107063293, -0.5682390332221985, 0.5951166152954102, 0.5682786107063293, -0.5682390332221985, 0.5951166152954102, 0.5682786107063293, -0.5951080918312073, 0.5682451725006104, -0.5682812929153442, -0.5951080918312073, 0.5682451725006104, -0.5682812929153442, -0.5951080918312073, 0.5682451725006104, -0.5682812929153442, -0.5951080918312073, 0.5682451725006104, -0.5682812929153442, -0.5682910680770874, 0.5950912833213806, -0.5682533383369446, -0.5682910680770874, 0.5950912833213806, -0.5682533383369446, -0.5682910680770874, 0.5950912833213806, -0.5682533383369446, -0.5682910680770874, 0.5950912833213806, -0.5682533383369446, 0.595115065574646, -0.5682411789894104, -0.5682781934738159, 0.595115065574646, -0.5682411789894104, -0.5682781934738159, 0.595115065574646, -0.5682411789894104, -0.5682781934738159, 0.595115065574646, -0.5682411789894104, -0.5682781934738159, 0.5682530999183655, -0.5682904720306396, -0.5950918197631836, 0.5682530999183655, -0.5682904720306396, -0.5950918197631836, 0.5682530999183655, -0.5682904720306396, -0.5950918197631836, 0.5682530999183655, -0.5682904720306396, -0.5950918197631836, 0.5682830810546875, 0.5682469010353088, -0.5951048731803894, 0.5682830810546875, 0.5682469010353088, -0.5951048731803894, 0.5682830810546875, 0.5682469010353088, -0.5951048731803894, 0.5682830810546875, 0.5682469010353088, -0.5951048731803894, 0.5682392716407776, 0.5951164960861206, -0.5682784914970398, 0.5682392716407776, 0.5951164960861206, -0.5682784914970398, 0.5682392716407776, 0.5951164960861206, -0.5682784914970398, 0.5682392716407776, 0.5951164960861206, -0.5682784914970398, 0.5951049327850342, 0.5682469010353088, 0.5682830214500427, 0.5951049327850342, 0.5682469010353088, 0.5682830214500427, 0.5951049327850342, 0.5682469010353088, 0.5682830214500427, 0.5951049327850342, 0.5682469010353088, 0.5682830214500427, -0.5682423114776611, -0.5951160788536072, -0.5682759881019592, -0.5682423114776611, -0.5951160788536072, -0.5682759881019592, -0.5682423114776611, -0.5951160788536072, -0.5682759881019592, -0.5682423114776611, -0.5951160788536072, -0.5682759881019592, -0.595117449760437, -0.5682770609855652, -0.568239688873291, -0.595117449760437, -0.5682770609855652, -0.568239688873291, -0.595117449760437, -0.5682770609855652, -0.568239688873291, -0.595117449760437, -0.5682770609855652, -0.568239688873291, 0.5950918197631836, -0.5682904720306396, 0.5682530999183655, 0.5950918197631836, -0.5682904720306396, 0.5682530999183655, 0.5950918197631836, -0.5682904720306396, 0.5682530999183655, 0.5950918197631836, -0.5682904720306396, 0.5682530999183655, -0.5682830810546875, 0.5682469010353088, 0.5951048731803894, -0.5682830810546875, 0.5682469010353088, 0.5951048731803894, -0.5682830810546875, 0.5682469010353088, 0.5951048731803894, -0.5682830810546875, 0.5682469010353088, 0.5951048731803894, 0.5682426691055298, -0.5951159000396729, 0.5682759284973145, 0.5682426691055298, -0.5951159000396729, 0.5682759284973145, 0.5682426691055298, -0.5951159000396729, 0.5682759284973145, 0.5682426691055298, -0.5951159000396729, 0.5682759284973145, 0.5682781934738159, -0.5682411193847656, 0.595115065574646, 0.5682781934738159, -0.5682411193847656, 0.595115065574646, 0.5682781934738159, -0.5682411193847656, 0.595115065574646, 0.5682781934738159, -0.5682411193847656, 0.595115065574646, -0.5682781934738159, -0.5682411193847656, -0.595115065574646, -0.5682781934738159, -0.5682411193847656, -0.595115065574646, -0.5682781934738159, -0.5682411193847656, -0.595115065574646, -0.5682781934738159, -0.5682411193847656, -0.595115065574646, 0.5682533383369446, 0.5682891607284546, 0.5950928330421448, 0.5682533383369446, 0.5682891607284546, 0.5950928330421448, 0.5682533383369446, 0.5682891607284546, 0.5950928330421448, 0.5682533383369446, 0.5682891607284546, 0.5950928330421448, 0.5950928330421448, 0.5682891607284546, -0.5682533383369446, 0.5950928330421448, 0.5682891607284546, -0.5682533383369446, 0.5950928330421448, 0.5682891607284546, -0.5682533383369446, 0.5950928330421448, 0.5682891607284546, -0.5682533383369446, 0.5682913064956665, 0.595090925693512, 0.5682531595230103, 0.5682913064956665, 0.595090925693512, 0.5682531595230103, 0.5682913064956665, 0.595090925693512, 0.5682531595230103, 0.5682913064956665, 0.595090925693512, 0.5682531595230103, -0.5682886838912964, -0.5950911641120911, 0.5682557225227356, -0.5682886838912964, -0.5950911641120911, 0.5682557225227356, -0.5682886838912964, -0.5950911641120911, 0.5682557225227356, -0.5682886838912964, -0.5950911641120911, 0.5682557225227356, 0.5682889819145203, -0.5950908660888672, -0.5682554841041565, 0.5682889819145203, -0.5950908660888672, -0.5682554841041565, 0.5682889819145203, -0.5950908660888672, -0.5682554841041565, 0.5682889819145203, -0.5950908660888672, -0.5682554841041565],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.07201391458511353, 0.011956751346588135, 0.1601339429616928, 0.228448748588562, 0.2343699038028717, 0.15436840057373047, 0.9927999973297119, 0.452796995639801, 0.14628882706165314, 0.22844743728637695, 0.213005930185318, 0.228448748588562, 0.23062995076179504, 0.19327861070632935, 0.3759610056877136, 0.5007950067520142, 0.036765892058610916, 0.011956632137298584, 0.2167847901582718, 0.011955499649047852, 0.2343699038028717, 0.13678330183029175, 0.9929670095443726, 0.2016180157661438, 0.1286647915840149, 0.011955201625823975, 0.2167847901582718, 0.22844743728637695, 0.23062995076179504, 0.1895385980606079, 0.8765519857406616, -0.00001895427703857422, 0.14628879725933075, 0.011955201625823975, 0.19916081428527832, 0.22844743728637695, 0.23062995076179504, 0.20712369680404663, 0.49237701296806335, 0.7024319767951965, 0.14250995218753815, 0.228448748588562, 0.1601339429616928, 0.011956632137298584, 0.2343699038028717, 0.19327861070632935, 0.876384973526001, 0.25116002559661865, 0.07201394438743591, 0.228448748588562, 0.14250992238521576, 0.011956632137298584, 0.2343699038028717, 0.20712369680404663, 0.7599689960479736, 0.452796995639801, 0.022920722141861916, 0.011955201625823975, 0.18153679370880127, 0.22844743728637695, 0.23062995076179504, 0.22470879554748535, 0.6253160238265991, 0.0010759830474853516, 0.08963792026042938, 0.011956632137298584, 0.18153676390647888, 0.011955499649047852, 0.23062995076179504, 0.15810835361480713, 0.7397840023040771, 0.19933903217315674, 0.00919399969279766, 0.7025139927864075, 0.07579275965690613, 0.011955320835113525, 0.17775794863700867, 0.011956751346588135, 0.23062995076179504, 0.15436840057373047, 0.07579278945922852, 0.22844737768173218, 0.10726193338632584, 0.228448748588562, 0.2343699038028717, 0.21086370944976807, 0.2420250028371811, 0.7025139927864075, 0.05816878750920296, 0.22844743728637695, 0.11104078590869904, 0.011955320835113525, 0.2343699038028717, 0.228448748588562, 0.6256870031356812, 0.2503969669342041, 0.09341679513454437, 0.22844743728637695, 0.1248859316110611, 0.228448748588562, 0.2343699038028717, 0.17195343971252441, 0.49275800585746765, 0.4534569978713989, 0.12488594651222229, 0.011956632137298584, 0.1639128178358078, 0.011955201625823975, 0.2343699038028717, 0.1895385980606079, 0.37544700503349304, 0.25026899576187134, 0.019141869619488716, 0.011956572532653809, 0.05438993498682976, 0.228448748588562, 0.12524299323558807, 0.2504919767379761, 0.2343699038028717, 0.22470879554748535, 0.19916081428527832, 0.011955499649047852, 0.2130059003829956, 0.011956751346588135, 0.2343699038028717, 0.1405232548713684, 0.2595460116863251, 0.7024319767951965, 0.019141899421811104, 0.228448748588562, 0.0405447743833065, 0.22844743728637695, 0.23062995076179504, 0.17569351196289062, 0.2416590005159378, 0.4521290063858032, 0.008828000165522099, 0.4521290063858032, 0.040544744580984116, 0.011955201625823975, 0.05438990518450737, 0.011956632137298584, 0.23062992095947266, 0.13678330183029175, 0.09341679513454437, 0.011955201625823975, 0.1639127880334854, 0.22844743728637695, 0.2343699038028717, 0.15810835361480713, 0.2581369876861572, 0.4534569978713989, 0.05816878750920296, 0.01195526123046875, 0.19538196921348572, 0.011956751346588135, 0.23062992095947266, 0.14052319526672363, 0.7421020269393921, 0.45203500986099243, 0.10726191848516464, 0.011956751346588135, 0.12560999393463135, 0.5008770227432251, 0.17775794863700867, 0.228448748588562, 0.23062995076179504, 0.228448748588562, 0.11104080080986023, 0.22844737768173218, 0.19538193941116333, 0.228448748588562, 0.23062995076179504, 0.21086370944976807, 0.5092710256576538, 0.45203500986099243, 0.036765921860933304, 0.228448748588562, 0.1286647915840149, 0.22844737768173218, 0.2343699038028717, 0.17569351196289062, 0.7601360082626343, 0.2016180157661438, 0.022920751944184303, 0.22844743728637695, 0.08963793516159058, 0.228448748588562, 0.23062995076179504, 0.17195343971252441, 0.5108489990234375, 0.19933903217315674],\n \"normalized\": false\n },\n \"color\": {\n \"itemSize\": 4,\n \"type\": \"Uint16Array\",\n \"array\": [65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535],\n \"normalized\": true\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [3, 23, 27, 36, 43, 81, 35, 31, 95, 75, 51, 55, 79, 47, 87, 63, 19, 7, 11, 15, 91, 68, 67, 58, 60, 85, 17, 30, 46, 59, 92, 56, 64, 6, 54, 14, 37, 24, 40, 45, 41, 84, 32, 48, 72, 16, 20, 4, 42, 18, 86, 50, 66, 90, 52, 89, 12, 61, 13, 9, 74, 39, 34, 71, 62, 10, 38, 29, 33, 21, 73, 53, 8, 65, 69, 44, 70, 57, 60, 77, 85, 30, 83, 46, 92, 28, 56, 6, 22, 54, 37, 0, 24, 45, 80, 41, 32, 93, 48, 16, 25, 20, 42, 26, 18, 50, 94, 66, 52, 49, 89, 61, 5, 13, 74, 2, 39, 71, 78, 62, 38, 82, 29, 21, 1, 73, 8, 88, 65, 44, 76, 70]\n },\n \"boundingSphere\": {\n \"center\": [0, 0, 0],\n \"radius\": 169.36543629583093\n }\n },\n faceValues: [5, 3, 1, 7, 2, 8, 6, 4],\n rotationCombinations: {\n \"1,2\": [180, 0, 180],\n \"1,3\": [90, 0, 0],\n \"1,4\": [0, 0, 90],\n \"1,5\": [-180, 0, 0],\n \"1,6\": [0, 0, 180],\n \"1,7\": [-90, 0, 0],\n \"1,8\": [90, 0, 180],\n \"2,3\": [90, 0, 180],\n \"2,4\": [-90, 0, 0],\n \"2,5\": [0, 0, 180],\n \"2,6\": [-180, 0, 0],\n \"2,7\": [-90, 0, -180],\n \"2,8\": [90, 0, 0],\n \"3,4\": [-180, 0, 180],\n \"3,5\": [90, 0, 0],\n \"3,6\": [-90, 0, -180],\n \"3,7\": [-180, 0, 0],\n \"3,8\": [0, 0, 180],\n \"4,5\": [90, 0, 180],\n \"4,6\": [-90, 0, 0],\n \"4,7\": [0, 0, -180],\n \"4,8\": [180, 0, 0],\n \"5,6\": [-180, 0, -180],\n \"5,7\": [90, 0, 0],\n \"5,8\": [-90, 0, 180],\n \"6,7\": [90, 0, -180],\n \"6,8\": [-90, 0, 0],\n \"7,8\": [-180, 0, -180]\n }\n },\n \"d10\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"1B9B60ED-6BEC-48CC-8EB9-EEFFC2DD3ED8\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-2.5946993827819824,1.8790435791015625,86.0141830444336,-2.5946993827819824,1.8790435791015625,86.0141830444336,-2.5946993827819824,1.8790435791015625,86.0141830444336,-2.5946993827819824,1.8790435791015625,86.0141830444336,71.31939697265625,-49.49197769165039,10.200661659240723,71.31939697265625,-49.49197769165039,10.200661659240723,71.31939697265625,-49.49197769165039,10.200661659240723,71.31939697265625,-49.49197769165039,10.200661659240723,87.39810180664062,-0.005702871363610029,-7.479601860046387,87.39810180664062,-0.005702871363610029,-7.479601860046387,87.39810180664062,-0.005702871363610029,-7.479601860046387,87.39810180664062,-0.005702871363610029,-7.479601860046387,3.2070045471191406,-0.005997277796268463,86.01419830322266,3.2070045471191406,-0.005997277796268463,86.01419830322266,3.2070045471191406,-0.005997277796268463,86.01419830322266,3.2070045471191406,-0.005997277796268463,86.01419830322266,-28.610445022583008,-81.96196746826172,10.200666427612305,-28.610445022583008,-81.96196746826172,10.200666427612305,-28.610445022583008,-81.96196746826172,10.200666427612305,-28.610445022583008,-81.96196746826172,10.200666427612305,69.1033706665039,-52.5421257019043,10.200669288635254,69.1033706665039,-52.5421257019043,10.200669288635254,69.1033706665039,-52.5421257019043,10.200669288635254,69.1033706665039,-52.5421257019043,10.200669288635254,0.9909778237342834,-3.0561423301696777,86.01419830322266,0.9909778237342834,-3.0561423301696777,86.01419830322266,0.9909778237342834,-3.0561423301696777,86.01419830322266,0.9909778237342834,-3.0561423301696777,86.01419830322266,70.70691680908203,-51.37708282470703,7.479945659637451,70.70691680908203,-51.37708282470703,7.479945659637451,70.70691680908203,-51.37708282470703,7.479945659637451,70.70691680908203,-51.37708282470703,7.479945659637451,-25.02603530883789,83.11405944824219,10.200100898742676,-25.02603530883789,83.11405944824219,10.200100898742676,-25.02603530883789,83.11405944824219,10.200100898742676,-25.02603530883789,83.11405944824219,10.200100898742676,-69.10337829589844,52.52949142456055,-10.200671195983887,-69.10337829589844,52.52949142456055,-10.200671195983887,-69.10337829589844,52.52949142456055,-10.200671195983887,-69.10337829589844,52.52949142456055,-10.200671195983887,-86.7856216430664,1.8781644105911255,10.200315475463867,-86.7856216430664,1.8781644105911255,10.200315475463867,-86.7856216430664,1.8781644105911255,10.200315475463867,-86.7856216430664,1.8781644105911255,10.200315475463867,-28.611663818359375,81.948974609375,10.200101852416992,-28.611663818359375,81.948974609375,10.200101852416992,-28.611663818359375,81.948974609375,10.200101852416992,-28.611663818359375,81.948974609375,10.200101852416992,-27.008115768432617,83.1140365600586,7.479378700256348,-27.008115768432617,83.1140365600586,7.479378700256348,-27.008115768432617,83.1140365600586,7.479378700256348,-27.008115768432617,83.1140365600586,7.479378700256348,-70.70691680908203,51.364444732666016,-7.479947566986084,-70.70691680908203,51.364444732666016,-7.479947566986084,-70.70691680908203,51.364444732666016,-7.479947566986084,-70.70691680908203,51.364444732666016,-7.479947566986084,71.31866455078125,49.48046112060547,10.200318336486816,71.31866455078125,49.48046112060547,10.200318336486816,71.31866455078125,49.48046112060547,10.200318336486816,71.31866455078125,49.48046112060547,10.200318336486816,86.78557586669922,1.8793641328811646,-10.20033073425293,86.78557586669922,1.8793641328811646,-10.20033073425293,86.78557586669922,1.8793641328811646,-10.20033073425293,86.78557586669922,1.8793641328811646,-10.20033073425293,69.10259246826172,52.53056716918945,10.20030689239502,69.10259246826172,52.53056716918945,10.20030689239502,69.10259246826172,52.53056716918945,10.20030689239502,69.10259246826172,52.53056716918945,10.20030689239502,70.7061538696289,51.36553192138672,7.479590892791748,70.7061538696289,51.36553192138672,7.479590892791748,70.7061538696289,51.36553192138672,7.479590892791748,70.7061538696289,51.36553192138672,7.479590892791748,2.5946712493896484,1.8784899711608887,-86.01419830322266,2.5946712493896484,1.8784899711608887,-86.01419830322266,2.5946712493896484,1.8784899711608887,-86.01419830322266,2.5946712493896484,1.8784899711608887,-86.01419830322266,28.610443115234375,81.9493408203125,-10.200669288635254,28.610443115234375,81.9493408203125,-10.200669288635254,28.610443115234375,81.9493408203125,-10.200669288635254,28.610443115234375,81.9493408203125,-10.200669288635254,86.78562927246094,-1.8908008337020874,-10.2003173828125,86.78562927246094,-1.8908008337020874,-10.2003173828125,86.78562927246094,-1.8908008337020874,-10.2003173828125,86.78562927246094,-1.8908008337020874,-10.2003173828125,0.9909327626228333,3.0441155433654785,86.0141830444336,0.9909327626228333,3.0441155433654785,86.0141830444336,0.9909327626228333,3.0441155433654785,86.0141830444336,0.9909327626228333,3.0441155433654785,86.0141830444336,-27.00689125061035,-83.12700653076172,7.479950428009033,-27.00689125061035,-83.12700653076172,7.479950428009033,-27.00689125061035,-83.12700653076172,7.479950428009033,-27.00689125061035,-83.12700653076172,7.479950428009033,-69.10259246826172,-52.54320526123047,-10.200308799743652,-69.10259246826172,-52.54320526123047,-10.200308799743652,-69.10259246826172,-52.54320526123047,-10.200308799743652,-69.10259246826172,-52.54320526123047,-10.200308799743652,2.594700574874878,-1.8916770219802856,-86.0141830444336,2.594700574874878,-1.8916770219802856,-86.0141830444336,2.594700574874878,-1.8916770219802856,-86.0141830444336,2.594700574874878,-1.8916770219802856,-86.0141830444336,25.026033401489258,-83.1266860961914,-10.200102806091309,25.026033401489258,-83.1266860961914,-10.200102806091309,25.026033401489258,-83.1266860961914,-10.200102806091309,25.026033401489258,-83.1266860961914,-10.200102806091309,-86.78559112548828,-1.892000436782837,10.200329780578613,-86.78559112548828,-1.892000436782837,10.200329780578613,-86.78559112548828,-1.892000436782837,10.200329780578613,-86.78559112548828,-1.892000436782837,10.200329780578613,-70.7061538696289,-51.37816619873047,-7.479592323303223,-70.7061538696289,-51.37816619873047,-7.479592323303223,-70.7061538696289,-51.37816619873047,-7.479592323303223,-70.7061538696289,-51.37816619873047,-7.479592323303223,-25.024797439575195,-83.12699127197266,10.200674057006836,-25.024797439575195,-83.12699127197266,10.200674057006836,-25.024797439575195,-83.12699127197266,10.200674057006836,-25.024797439575195,-83.12699127197266,10.200674057006836,-2.5946712493896484,-1.8911232948303223,86.01419830322266,-2.5946712493896484,-1.8911232948303223,86.01419830322266,-2.5946712493896484,-1.8911232948303223,86.01419830322266,-2.5946712493896484,-1.8911232948303223,86.01419830322266,-71.31940460205078,49.47935104370117,-10.200664520263672,-71.31940460205078,49.47935104370117,-10.200664520263672,-71.31940460205078,49.47935104370117,-10.200664520263672,-71.31940460205078,49.47935104370117,-10.200664520263672,28.611663818359375,-81.96160888671875,-10.200103759765625,28.611663818359375,-81.96160888671875,-10.200103759765625,28.611663818359375,-81.96160888671875,-10.200103759765625,28.611663818359375,-81.96160888671875,-10.200103759765625,27.00688934326172,83.1143798828125,-7.479951858520508,27.00688934326172,83.1143798828125,-7.479951858520508,27.00688934326172,83.1143798828125,-7.479951858520508,27.00688934326172,83.1143798828125,-7.479951858520508,25.024797439575195,83.11434936523438,-10.200675010681152,25.024797439575195,83.11434936523438,-10.200675010681152,25.024797439575195,83.11434936523438,-10.200675010681152,25.024797439575195,83.11434936523438,-10.200675010681152,27.008115768432617,-83.12667083740234,-7.4793806076049805,27.008115768432617,-83.12667083740234,-7.4793806076049805,27.008115768432617,-83.12667083740234,-7.4793806076049805,27.008115768432617,-83.12667083740234,-7.4793806076049805,-87.39810180664062,-0.006933570373803377,7.479599952697754,-87.39810180664062,-0.006933570373803377,7.479599952697754,-87.39810180664062,-0.006933570373803377,7.479599952697754,-87.39810180664062,-0.006933570373803377,7.479599952697754,-71.31866455078125,-49.493099212646484,-10.20032024383545,-71.31866455078125,-49.493099212646484,-10.20032024383545,-71.31866455078125,-49.493099212646484,-10.20032024383545,-71.31866455078125,-49.493099212646484,-10.20032024383545,-0.9909327626228333,-3.056749105453491,-86.0141830444336,-0.9909327626228333,-3.056749105453491,-86.0141830444336,-0.9909327626228333,-3.056749105453491,-86.0141830444336,-0.9909327626228333,-3.056749105453491,-86.0141830444336,-3.2070045471191406,-0.006636159960180521,-86.01419830322266,-3.2070045471191406,-0.006636159960180521,-86.01419830322266,-3.2070045471191406,-0.006636159960180521,-86.01419830322266,-3.2070045471191406,-0.006636159960180521,-86.01419830322266,-0.9909778237342834,3.0435099601745605,-86.01419830322266,-0.9909778237342834,3.0435099601745605,-86.01419830322266,-0.9909778237342834,3.0435099601745605,-86.01419830322266,-0.9909778237342834,3.0435099601745605,-86.01419830322266],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-0.5870956778526306,0.42651230096817017,0.6880449652671814,-0.5870956778526306,0.42651230096817017,0.6880449652671814,-0.5870956778526306,0.42651230096817017,0.6880449652671814,-0.5870956778526306,0.42651230096817017,0.6880449652671814,0.745985746383667,-0.033444374799728394,0.6651214957237244,0.745985746383667,-0.033444374799728394,0.6651214957237244,0.745985746383667,-0.033444374799728394,0.6651214957237244,0.745985746383667,-0.033444374799728394,0.6651214957237244,0.7662718892097473,0.00003863871097564697,0.6425164937973022,0.7662718892097473,0.00003863871097564697,0.6425164937973022,0.7662718892097473,0.00003863871097564697,0.6425164937973022,0.7662718892097473,0.00003863871097564697,0.6425164937973022,0.7256649732589722,0.000032261013984680176,0.6880481839179993,0.7256649732589722,0.000032261013984680176,0.6880481839179993,0.7256649732589722,0.000032261013984680176,0.6880481839179993,0.7256649732589722,0.000032261013984680176,0.6880481839179993,-0.5838431119918823,-0.4655483365058899,0.6651255488395691,-0.5838431119918823,-0.4655483365058899,0.6651255488395691,-0.5838431119918823,-0.4655483365058899,0.6651255488395691,-0.5838431119918823,-0.4655483365058899,0.6651255488395691,0.2623160779476166,-0.6991221904754639,0.6651454567909241,0.2623160779476166,-0.6991221904754639,0.6651454567909241,0.2623160779476166,-0.6991221904754639,0.6651454567909241,0.2623160779476166,-0.6991221904754639,0.6651454567909241,0.22423836588859558,-0.6901593208312988,0.6880385875701904,0.22423836588859558,-0.6901593208312988,0.6880385875701904,0.22423836588859558,-0.6901593208312988,0.6880385875701904,0.22423836588859558,-0.6901593208312988,0.6880385875701904,0.6199150085449219,-0.4504251182079315,-0.6425127983093262,0.6199150085449219,-0.4504251182079315,-0.6425127983093262,0.6199150085449219,-0.4504251182079315,-0.6425127983093262,0.6199150085449219,-0.4504251182079315,-0.6425127983093262,0.19871656596660614,0.7197921276092529,0.6651397347450256,0.19871656596660614,0.7197921276092529,0.6651397347450256,0.19871656596660614,0.7197921276092529,0.6651397347450256,0.19871656596660614,0.7197921276092529,0.6651397347450256,-0.26231205463409424,0.6991309523582458,-0.665137767791748,-0.26231205463409424,0.6991309523582458,-0.665137767791748,-0.26231205463409424,0.6991309523582458,-0.665137767791748,-0.26231205463409424,0.6991309523582458,-0.665137767791748,-0.6231518387794495,0.41137412190437317,0.6651715636253357,-0.6231518387794495,0.41137412190437317,0.6651715636253357,-0.6231518387794495,0.41137412190437317,0.6651715636253357,-0.6231518387794495,0.41137412190437317,0.6651715636253357,-0.583817720413208,0.46555060148239136,0.6651462912559509,-0.583817720413208,0.46555060148239136,0.6651462912559509,-0.583817720413208,0.46555060148239136,0.6651462912559509,-0.583817720413208,0.46555060148239136,0.6651462912559509,-0.23676739633083344,0.7287734746932983,-0.6425187587738037,-0.23676739633083344,0.7287734746932983,-0.6425187587738037,-0.23676739633083344,0.7287734746932983,-0.6425187587738037,-0.23676739633083344,0.7287734746932983,-0.6425187587738037,-0.6199446320533752,0.45038023591041565,0.6425155997276306,-0.6199446320533752,0.45038023591041565,0.6425155997276306,-0.6199446320533752,0.45038023591041565,0.6425155997276306,-0.6199446320533752,0.45038023591041565,0.6425155997276306,0.7459679841995239,0.03343930095434189,0.6651415824890137,0.7459679841995239,0.03343930095434189,0.6651415824890137,0.7459679841995239,0.03343930095434189,0.6651415824890137,0.7459679841995239,0.03343930095434189,0.6651415824890137,0.623174250125885,0.4114120602607727,-0.6651270389556885,0.623174250125885,0.4114120602607727,-0.6651270389556885,0.623174250125885,0.4114120602607727,-0.6651270389556885,0.623174250125885,0.4114120602607727,-0.6651270389556885,0.26233187317848206,0.6991434097290039,0.6651169061660767,0.26233187317848206,0.6991434097290039,0.6651169061660767,0.26233187317848206,0.6991434097290039,0.6651169061660767,0.26233187317848206,0.6991434097290039,0.6651169061660767,0.6199406385421753,0.45038270950317383,-0.6425178050994873,0.6199406385421753,0.45038270950317383,-0.6425178050994873,0.6199406385421753,0.45038270950317383,-0.6425178050994873,0.6199406385421753,0.45038270950317383,-0.6425178050994873,0.587073564529419,0.4265226125717163,-0.6880576610565186,0.587073564529419,0.4265226125717163,-0.6880576610565186,0.587073564529419,0.4265226125717163,-0.6880576610565186,0.587073564529419,0.4265226125717163,-0.6880576610565186,0.5838503241539001,0.4655469059944153,-0.6651202440261841,0.5838503241539001,0.4655469059944153,-0.6651202440261841,0.5838503241539001,0.4655469059944153,-0.6651202440261841,0.5838503241539001,0.4655469059944153,-0.6651202440261841,0.6231569647789001,-0.4114269018173218,-0.665134072303772,0.6231569647789001,-0.4114269018173218,-0.665134072303772,0.6231569647789001,-0.4114269018173218,-0.665134072303772,0.6231569647789001,-0.4114269018173218,-0.665134072303772,0.22424747049808502,0.6901424527168274,0.6880526542663574,0.22424747049808502,0.6901424527168274,0.6880526542663574,0.22424747049808502,0.6901424527168274,0.6880526542663574,0.22424747049808502,0.6901424527168274,0.6880526542663574,-0.2368125319480896,-0.7287622094154358,-0.6425150632858276,-0.2368125319480896,-0.7287622094154358,-0.6425150632858276,-0.2368125319480896,-0.7287622094154358,-0.6425150632858276,-0.2368125319480896,-0.7287622094154358,-0.6425150632858276,-0.2623360753059387,-0.6991369128227234,-0.6651220917701721,-0.2623360753059387,-0.6991369128227234,-0.6651220917701721,-0.2623360753059387,-0.6991369128227234,-0.6651220917701721,-0.2623360753059387,-0.6991369128227234,-0.6651220917701721,0.5870862603187561,-0.42650753259658813,-0.6880559921264648,0.5870862603187561,-0.42650753259658813,-0.6880559921264648,0.5870862603187561,-0.42650753259658813,-0.6880559921264648,0.5870862603187561,-0.42650753259658813,-0.6880559921264648,-0.19872358441352844,-0.7197949886322021,-0.6651346683502197,-0.19872358441352844,-0.7197949886322021,-0.6651346683502197,-0.19872358441352844,-0.7197949886322021,-0.6651346683502197,-0.19872358441352844,-0.7197949886322021,-0.6651346683502197,-0.623177170753479,-0.4114185571670532,0.6651203036308289,-0.623177170753479,-0.4114185571670532,0.6651203036308289,-0.623177170753479,-0.4114185571670532,0.6651203036308289,-0.623177170753479,-0.4114185571670532,0.6651203036308289,-0.6199068427085876,-0.45042937994003296,0.6425175666809082,-0.6199068427085876,-0.45042937994003296,0.6425175666809082,-0.6199068427085876,-0.45042937994003296,0.6425175666809082,-0.6199068427085876,-0.45042937994003296,0.6425175666809082,0.19873395562171936,-0.7197892069816589,0.6651378273963928,0.19873395562171936,-0.7197892069816589,0.6651378273963928,0.19873395562171936,-0.7197892069816589,0.6651378273963928,0.19873395562171936,-0.7197892069816589,0.6651378273963928,-0.5870490074157715,-0.42655661702156067,0.6880573630332947,-0.5870490074157715,-0.42655661702156067,0.6880573630332947,-0.5870490074157715,-0.42655661702156067,0.6880573630332947,-0.5870490074157715,-0.42655661702156067,0.6880573630332947,-0.7459824085235596,0.033452022820711136,-0.665124773979187,-0.7459824085235596,0.033452022820711136,-0.665124773979187,-0.7459824085235596,0.033452022820711136,-0.665124773979187,-0.7459824085235596,0.033452022820711136,-0.665124773979187,0.5838494300842285,-0.4655435383319855,-0.665123462677002,0.5838494300842285,-0.4655435383319855,-0.665123462677002,0.5838494300842285,-0.4655435383319855,-0.665123462677002,0.5838494300842285,-0.4655435383319855,-0.665123462677002,0.2367572784423828,0.7287806272506714,0.6425143480300903,0.2367572784423828,0.7287806272506714,0.6425143480300903,0.2367572784423828,0.7287806272506714,0.6425143480300903,0.2367572784423828,0.7287806272506714,0.6425143480300903,-0.1987278163433075,0.7197844982147217,-0.6651448011398315,-0.1987278163433075,0.7197844982147217,-0.6651448011398315,-0.1987278163433075,0.7197844982147217,-0.6651448011398315,-0.1987278163433075,0.7197844982147217,-0.6651448011398315,0.23682300746440887,-0.7287558913230896,0.6425182819366455,0.23682300746440887,-0.7287558913230896,0.6425182819366455,0.23682300746440887,-0.7287558913230896,0.6425182819366455,0.23682300746440887,-0.7287558913230896,0.6425182819366455,-0.7662706971168518,0.000020429491996765137,-0.6425180435180664,-0.7662706971168518,0.000020429491996765137,-0.6425180435180664,-0.7662706971168518,0.000020429491996765137,-0.6425180435180664,-0.7662706971168518,0.000020429491996765137,-0.6425180435180664,-0.7459728717803955,-0.03343328833580017,-0.6651365756988525,-0.7459728717803955,-0.03343328833580017,-0.6651365756988525,-0.7459728717803955,-0.03343328833580017,-0.6651365756988525,-0.7459728717803955,-0.03343328833580017,-0.6651365756988525,-0.22426503896713257,-0.6901455521583557,-0.6880438327789307,-0.22426503896713257,-0.6901455521583557,-0.6880438327789307,-0.22426503896713257,-0.6901455521583557,-0.6880438327789307,-0.22426503896713257,-0.6901455521583557,-0.6880438327789307,-0.7256579995155334,-0.00003316998481750488,-0.6880554556846619,-0.7256579995155334,-0.00003316998481750488,-0.6880554556846619,-0.7256579995155334,-0.00003316998481750488,-0.6880554556846619,-0.7256579995155334,-0.00003316998481750488,-0.6880554556846619,-0.22427412867546082,0.6901446580886841,-0.6880418658256531,-0.22427412867546082,0.6901446580886841,-0.6880418658256531,-0.22427412867546082,0.6901446580886841,-0.6880418658256531,-0.22427412867546082,0.6901446580886841,-0.6880418658256531],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.1126541942358017,0.23340463638305664,0.15771642327308655,0.010170280933380127,0.1696747988462448,0.09594517946243286,0.37625399231910706,0.5020440220832825,0.09763339906930923,0.23340469598770142,0.17146287858486176,0.012006521224975586,0.24126237630844116,0.007275700569152832,0.7849239706993103,0.19342201948165894,0.18520936369895935,0.026231110095977783,0.19948936998844147,0.1231493353843689,0.24126237630844116,0.11555743217468262,0.8759239912033081,0.2386530041694641,0.05257079377770424,0.23340463638305664,0.09763336926698685,0.010167598724365234,0.1696747988462448,0.08392536640167236,0.8759239912033081,0.0006530284881591797,0.015100483782589436,0.23340469598770142,0.17080335319042206,0.06890475749969482,0.21341374516487122,0.23143154382705688,0.4681450128555298,0.19335603713989258,0.09020465612411499,0.23340463638305664,0.16530834138393402,0.016166627407073975,0.22733810544013977,0.11358428001403809,0.9650390148162842,0.44349002838134766,0.022529248148202896,0.010164380073547363,0.09020490944385529,0.010167598724365234,0.176739901304245,0.08622092008590698,0.8740389943122864,0.2507209777832031,0.17146287858486176,0.018639087677001953,0.22100581228733063,0.11555743217468262,0.23493003845214844,0.005302548408508301,0.6253309845924377,0.739175021648407,0.15028777718544006,0.23340463638305664,0.18520939350128174,0.018639087677001953,0.2412623167037964,0.23143154382705688,0.46857601404190063,0.4435969591140747,0.06016269698739052,0.010176539421081543,0.179232656955719,0.2314314842224121,0.18520936369895935,0.05468016862869263,0.5344629883766174,0.1933860182762146,0.11265438795089722,0.010173439979553223,0.16530834138393402,0.12512201070785522,0.18389028310775757,0.06890475749969482,0.46725401282310486,0.6948130130767822,0.15771642327308655,0.23340457677841187,0.1790548413991928,0.01447904109954834,0.1855650693178177,0.12512195110321045,0.28525400161743164,0.6948130130767822,0.17923292517662048,0.12314879894256592,0.18520939350128174,0.012006521224975586,0.2349299192428589,0.23340469598770142,0.6254630088806152,0.23861700296401978,0.1653086096048355,0.23340469598770142,0.18520936369895935,0.06131279468536377,0.1855650693178177,0.23340469598770142,0.37625399231910706,0.7400439977645874,0.05257079377770424,0.01016455888748169,0.17146287858486176,0.032863736152648926,0.19948936998844147,0.23143154382705688,0.9669240117073059,0.19342201948165894,0.14269573986530304,0.010170340538024902,0.18520936369895935,0.032863736152648926,0.19315698742866516,0.12512242794036865,0.21655499935150146,0.6933860182762146,0.04514260217547417,0.01016455888748169,0.16530832648277283,0.02870357036590576,0.21341368556022644,0.007275700569152832,0.2865760028362274,0.4435969591140747,0.12555499374866486,0.7386170029640198,0.17146287858486176,0.026231110095977783,0.1931571662425995,0.23340469598770142,0.2070813775062561,0.005302548408508301,0.12555499374866486,0.5006170272827148,0.12767508625984192,0.010170459747314453,0.14269573986530304,0.23340463638305664,0.16530832648277283,0.109546959400177,0.03455499932169914,0.6933860182762146,0.12767508625984192,0.23340463638305664,0.17146290838718414,0.040455639362335205,0.2070814073085785,0.11358422040939331,0.1352669894695282,0.010170340538024902,0.17905481159687042,0.028703629970550537,0.23493003845214844,0.11358428001403809,0.5343310236930847,0.693943977355957,0.04514192417263985,0.23340457677841187,0.1502876579761505,0.010170280933380127,0.16530834138393402,0.089935302734375,0.37757599353790283,0.2508280277252197,0.12430000305175781,0.48809099197387695,0.16530832648277283,0.07261902093887329,0.19948936998844147,0.11555695533752441,0.20708149671554565,0.23340469598770142,0.0301218219101429,0.23340463638305664,0.17146289348602295,0.06131279468536377,0.2070813775062561,0.1251225471496582,0.2153010070323944,0.4428600072860718,0.08261273801326752,0.23340463638305664,0.13526709377765656,0.23340463638305664,0.16967478394508362,0.11555695533752441,0.6253309845924377,0.5011749863624573,0.03330099955201149,0.4428600072860718,0.07518399506807327,0.010167300701141357,0.17905481159687042,0.042928099632263184,0.19948936998844147,0.007275700569152832,0.10522530972957611,0.010173439979553223,0.18389026820659637,0.07633346319198608,0.22100578248500824,0.23143154382705688,0.28614500164985657,0.19335603713989258,0.17146289348602295,0.05468016862869263,0.21341368556022644,0.12314939498901367,0.2210056483745575,0.1231493353843689,0.377144992351532,0.23858702182769775,0.02252865955233574,0.23340469598770142,0.17080335319042206,0.07633340358734131,0.19315703213214874,0.11358380317687988,0.7830389738082886,0.44349002838134766,0.015100372023880482,0.010164380073547363,0.10522563755512238,0.23340463638305664,0.1767398715019226,0.09364962577819824,0.377144992351532,0.0005869865417480469,0.0675920695066452,0.010176539421081543,0.17164073884487152,0.23143154382705688,0.17905481159687042,0.05884033441543579,0.7172229886054993,0.4428600072860718,0.08261273801326752,0.010167300701141357,0.18520936369895935,0.04708826541900635,0.2210056483745575,0.007276654243469238,0.7163310050964355,0.693943977355957,0.17146290838718414,0.04708826541900635,0.21341368556022644,0.11555737257003784,0.2412623167037964,0.12314939498901367,0.37757599353790283,0.48882800340652466,0.12024644762277603,0.23340463638305664,0.16530834138393402,0.044615745544433594,0.23493006825447083,0.1251225471496582,0.716463029384613,0.1933860182762146,0.18520936369895935,0.040455639362335205,0.19315698742866516,0.005302488803863525,0.22733810544013977,0.005303502082824707,0.8740389943122864,0.48872101306915283,0.17164073884487152,0.1231488585472107,0.17839525640010834,0.07261908054351807,0.2273380160331726,0.23340463638305664,0.6262230277061462,0.48809099197387695,0.037550006061792374,0.23340463638305664,0.16530834138393402,0.057152748107910156,0.2273380160331726,0.12512242794036865,0.5352230072021484,0.4428600072860718,0.030121158808469772,0.010164439678192139,0.07518427819013596,0.23340463638305664,0.12430000305175781,0.25009095668792725,0.176739901304245,0.11326134204864502,0.037550006061792374,0.010164439678192139,0.0675920695066452,0.23340457677841187,0.176739901304245,0.10583275556564331,0.6262230277061462,0.25009095668792725,0.06016361340880394,0.23340463638305664,0.12024631351232529,0.010170459747314453,0.16967478394508362,0.10353708267211914,0.6254630088806152,0.0006170272827148438],\n \"normalized\": false\n },\n \"color\": {\n \"itemSize\": 4,\n \"type\": \"Uint16Array\",\n \"array\": [65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535],\n \"normalized\": true\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [23,115,139,123,147,143,19,107,111,35,67,131,59,7,11,95,100,88,63,76,68,135,39,51,127,83,31,4,25,20,82,6,30,97,60,80,62,58,9,22,126,29,94,18,109,37,46,48,0,104,117,44,85,32,66,79,129,124,149,96,114,103,137,156,120,36,146,106,142,24,16,112,34,134,50,152,92,144,77,157,132,41,121,140,102,125,136,5,21,28,61,8,81,69,65,57,78,133,128,45,33,49,53,38,122,42,141,105,93,108,145,89,113,17,98,151,154,43,47,55,12,64,84,86,118,26,23,27,115,123,155,147,19,119,107,35,87,67,59,15,7,95,150,100,63,72,76,135,159,39,127,99,83,4,13,25,82,10,6,97,74,60,62,70,58,22,138,126,94,91,18,37,54,46,0,40,104,44,1,85,66,71,79,124,101,149,114,90,103,156,153,120,146,110,106,24,116,16,34,130,134,152,148,92,77,73,157,41,52,121,158,75,154,75,98,154,43,3,47,12,56,64,26,14,86,86,2,118]\n },\n \"boundingSphere\": {\n \"center\": [0,-0.006313323974609375,0],\n \"radius\": 148.14155442794186\n }\n },\n faceValues: [1, 2, 5, 10, 7, 4, 3, 8, 9, 6],\n rotationCombinations: {\n \"1,2\": [180, 0, 36],\n \"1,3\": [0, 0, -144],\n \"1,4\": [-180, 0, -108],\n \"1,5\": [0, 0, 144],\n \"1,6\": [180, 0, -36],\n \"1,7\": [0, 0, -72],\n \"1,8\": [180, 0, 108],\n \"1,9\": [0, 0, 72],\n \"1,10\": [-180, 0, 180],\n \"2,3\": [180, 0, -108],\n \"2,4\": [0, 0, -144],\n \"2,5\": [-180, 0, -180],\n \"2,6\": [0, 0, -72],\n \"2,7\": [180, 0, -36],\n \"2,8\": [0, 0, 72],\n \"2,9\": [-180, 0, 108],\n \"2,10\": [0, 0, 144],\n \"3,4\": [-180, 0, 108],\n \"3,5\": [0, 0, -72],\n \"3,6\": [-180, 0, 180],\n \"3,7\": [0, 0, 72],\n \"3,8\": [180, 0, -36],\n \"3,9\": [0, 0, -144],\n \"3,10\": [180, 0, 36],\n \"4,5\": [180, 0, 36],\n \"4,6\": [0, 0, 72],\n \"4,7\": [-180, 0, -180],\n \"4,8\": [0, 0, -144],\n \"4,9\": [180, 0, -36],\n \"4,10\": [0, 0, -72],\n \"5,6\": [180, 0, 108],\n \"5,7\": [0, 0, 144],\n \"5,8\": [-180, 0, -108],\n \"5,9\": [0, 0, -72],\n \"5,10\": [180, 0, -36],\n \"6,7\": [180, 0, -108],\n \"6,8\": [0, 0, 144],\n \"6,9\": [-180, 0, 36],\n \"6,10\": [0, 0, -144],\n \"7,8\": [180, 0, 36],\n \"7,9\": [0, 0, 144],\n \"7,10\": [-180, 0, 108],\n \"8,9\": [-180, 0, 180],\n \"8,10\": [0, 0, 72],\n \"9,10\": [180, 0, -108]\n\n }\n },\n \"d12\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"04389FAB-5CCD-4FEC-B604-C19AD1000B1C\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-31.141719818115234, 83.4803466796875, -1.2052193880081177, -31.141719818115234, 83.4803466796875, -1.2052193880081177, -31.141719818115234, 83.4803466796875, -1.2052193880081177, -31.141719818115234, 83.4803466796875, -1.2052193880081177, 83.48023223876953, -1.2053337097167969, -31.14202308654785, 83.48023223876953, -1.2053337097167969, -31.14202308654785, 83.48023223876953, -1.2053337097167969, -31.14202308654785, 83.48023223876953, -1.2053337097167969, -31.14202308654785, 83.48045349121094, -1.2053337097167969, 31.141408920288086, 83.48045349121094, -1.2053337097167969, 31.141408920288086, 83.48045349121094, -1.2053337097167969, 31.141408920288086, 83.48045349121094, -1.2053337097167969, 31.141408920288086, -82.73528289794922, 0, 33.09229278564453, -82.73528289794922, 0, 33.09229278564453, -82.73528289794922, 0, 33.09229278564453, -82.73528289794922, 0, 33.09229278564453, 51.59387969970703, 50.38835906982422, 52.338436126708984, 51.59387969970703, 50.38835906982422, 52.338436126708984, 51.59387969970703, 50.38835906982422, 52.338436126708984, 51.59387969970703, 50.38835906982422, 52.338436126708984, 50.3885498046875, 52.338626861572266, 51.593505859375, 50.3885498046875, 52.338626861572266, 51.593505859375, 50.3885498046875, 52.338626861572266, 51.593505859375, 50.3885498046875, 52.338626861572266, 51.593505859375, -31.141712188720703, 83.4803466796875, 1.2054481506347656, -31.141712188720703, 83.4803466796875, 1.2054481506347656, -31.141712188720703, 83.4803466796875, 1.2054481506347656, -31.141712188720703, 83.4803466796875, 1.2054481506347656, 83.48023223876953, 1.2053337097167969, -31.14202308654785, 83.48023223876953, 1.2053337097167969, -31.14202308654785, 83.48023223876953, 1.2053337097167969, -31.14202308654785, 83.48023223876953, 1.2053337097167969, -31.14202308654785, -83.48045349121094, -1.2053337097167969, -31.141408920288086, -83.48045349121094, -1.2053337097167969, -31.141408920288086, -83.48045349121094, -1.2053337097167969, -31.141408920288086, -83.48045349121094, -1.2053337097167969, -31.141408920288086, -51.59387969970703, -50.38835906982422, -52.338436126708984, -51.59387969970703, -50.38835906982422, -52.338436126708984, -51.59387969970703, -50.38835906982422, -52.338436126708984, -51.59387969970703, -50.38835906982422, -52.338436126708984, -1.205640435218811, 31.14171600341797, -83.48033142089844, -1.205640435218811, 31.14171600341797, -83.48033142089844, -1.205640435218811, 31.14171600341797, -83.48033142089844, -1.205640435218811, 31.14171600341797, -83.48033142089844, -1.205640435218811, -31.14171600341797, -83.48033142089844, -1.205640435218811, -31.14171600341797, -83.48033142089844, -1.205640435218811, -31.14171600341797, -83.48033142089844, -1.205640435218811, -31.14171600341797, -83.48033142089844, 1.2050271034240723, 31.14171600341797, -83.48035430908203, 1.2050271034240723, 31.14171600341797, -83.48035430908203, 1.2050271034240723, 31.14171600341797, -83.48035430908203, 1.2050271034240723, 31.14171600341797, -83.48035430908203, -83.48045349121094, 1.2053337097167969, -31.141408920288086, -83.48045349121094, 1.2053337097167969, -31.141408920288086, -83.48045349121094, 1.2053337097167969, -31.141408920288086, -83.48045349121094, 1.2053337097167969, -31.141408920288086, -83.48023223876953, 1.2053337097167969, 31.14202308654785, -83.48023223876953, 1.2053337097167969, 31.14202308654785, -83.48023223876953, 1.2053337097167969, 31.14202308654785, -83.48023223876953, 1.2053337097167969, 31.14202308654785, -50.38816833496094, -52.338626861572266, 51.593875885009766, -50.38816833496094, -52.338626861572266, 51.593875885009766, -50.38816833496094, -52.338626861572266, 51.593875885009766, -50.38816833496094, -52.338626861572266, 51.593875885009766, 31.141712188720703, 83.4803466796875, -1.2054481506347656, 31.141712188720703, 83.4803466796875, -1.2054481506347656, 31.141712188720703, 83.4803466796875, -1.2054481506347656, 31.141712188720703, 83.4803466796875, -1.2054481506347656, -50.3885498046875, 52.338626861572266, -51.593505859375, -50.3885498046875, 52.338626861572266, -51.593505859375, -50.3885498046875, 52.338626861572266, -51.593505859375, -50.3885498046875, 52.338626861572266, -51.593505859375, 50.38816833496094, 52.338626861572266, -51.593875885009766, 50.38816833496094, 52.338626861572266, -51.593875885009766, 50.38816833496094, 52.338626861572266, -51.593875885009766, 50.38816833496094, 52.338626861572266, -51.593875885009766, -0.000303904089378193, 33.09198760986328, -82.73540496826172, -0.000303904089378193, 33.09198760986328, -82.73540496826172, -0.000303904089378193, 33.09198760986328, -82.73540496826172, -0.000303904089378193, 33.09198760986328, -82.73540496826172, 82.73552703857422, 0, 33.0916862487793, 82.73552703857422, 0, 33.0916862487793, 82.73552703857422, 0, 33.0916862487793, 82.73552703857422, 0, 33.0916862487793, 52.338809967041016, -51.59368896484375, 50.38816833496094, 52.338809967041016, -51.59368896484375, 50.38816833496094, 52.338809967041016, -51.59368896484375, 50.38816833496094, 52.338809967041016, -51.59368896484375, 50.38816833496094, 83.48045349121094, 1.2053337097167969, 31.141408920288086, 83.48045349121094, 1.2053337097167969, 31.141408920288086, 83.48045349121094, 1.2053337097167969, 31.141408920288086, 83.48045349121094, 1.2053337097167969, 31.141408920288086, 52.33843994140625, -51.59368896484375, -50.3885498046875, 52.33843994140625, -51.59368896484375, -50.3885498046875, 52.33843994140625, -51.59368896484375, -50.3885498046875, 52.33843994140625, -51.59368896484375, -50.3885498046875, 51.593502044677734, -50.38835906982422, -52.33881759643555, 51.593502044677734, -50.38835906982422, -52.33881759643555, 51.593502044677734, -50.38835906982422, -52.33881759643555, 51.593502044677734, -50.38835906982422, -52.33881759643555, 82.73528289794922, 0, -33.09229278564453, 82.73528289794922, 0, -33.09229278564453, 82.73528289794922, 0, -33.09229278564453, 82.73528289794922, 0, -33.09229278564453, 33.09198760986328, -82.73540496826172, -0.00012155366130173206, 33.09198760986328, -82.73540496826172, -0.00012155366130173206, 33.09198760986328, -82.73540496826172, -0.00012155366130173206, 33.09198760986328, -82.73540496826172, -0.00012155366130173206, -1.2050271034240723, -31.14171600341797, 83.48035430908203, -1.2050271034240723, -31.14171600341797, 83.48035430908203, -1.2050271034240723, -31.14171600341797, 83.48035430908203, -1.2050271034240723, -31.14171600341797, 83.48035430908203, -1.2050271034240723, 31.14171600341797, 83.48035430908203, -1.2050271034240723, 31.14171600341797, 83.48035430908203, -1.2050271034240723, 31.14171600341797, 83.48035430908203, -1.2050271034240723, 31.14171600341797, 83.48035430908203, -52.33843994140625, -51.59368896484375, 50.3885498046875, -52.33843994140625, -51.59368896484375, 50.3885498046875, -52.33843994140625, -51.59368896484375, 50.3885498046875, -52.33843994140625, -51.59368896484375, 50.3885498046875, -51.593502044677734, -50.38835906982422, 52.33881759643555, -51.593502044677734, -50.38835906982422, 52.33881759643555, -51.593502044677734, -50.38835906982422, 52.33881759643555, -51.593502044677734, -50.38835906982422, 52.33881759643555, -51.593502044677734, 50.38835906982422, 52.33881759643555, -51.593502044677734, 50.38835906982422, 52.33881759643555, -51.593502044677734, 50.38835906982422, 52.33881759643555, -51.593502044677734, 50.38835906982422, 52.33881759643555, -52.33843994140625, 51.59368896484375, 50.3885498046875, -52.33843994140625, 51.59368896484375, 50.3885498046875, -52.33843994140625, 51.59368896484375, 50.3885498046875, -52.33843994140625, 51.59368896484375, 50.3885498046875, 0.000303904089378193, 33.09198760986328, 82.73540496826172, 0.000303904089378193, 33.09198760986328, 82.73540496826172, 0.000303904089378193, 33.09198760986328, 82.73540496826172, 0.000303904089378193, 33.09198760986328, 82.73540496826172, 52.338809967041016, 51.59368896484375, 50.38816833496094, 52.338809967041016, 51.59368896484375, 50.38816833496094, 52.338809967041016, 51.59368896484375, 50.38816833496094, 52.338809967041016, 51.59368896484375, 50.38816833496094, 1.205640435218811, -31.14171600341797, 83.48033142089844, 1.205640435218811, -31.14171600341797, 83.48033142089844, 1.205640435218811, -31.14171600341797, 83.48033142089844, 1.205640435218811, -31.14171600341797, 83.48033142089844, -33.09198760986328, 82.73540496826172, 0.00012155366130173206, -33.09198760986328, 82.73540496826172, 0.00012155366130173206, -33.09198760986328, 82.73540496826172, 0.00012155366130173206, -33.09198760986328, 82.73540496826172, 0.00012155366130173206, -50.38816833496094, 52.338626861572266, 51.593875885009766, -50.38816833496094, 52.338626861572266, 51.593875885009766, -50.38816833496094, 52.338626861572266, 51.593875885009766, -50.38816833496094, 52.338626861572266, 51.593875885009766, 51.593502044677734, 50.38835906982422, -52.33881759643555, 51.593502044677734, 50.38835906982422, -52.33881759643555, 51.593502044677734, 50.38835906982422, -52.33881759643555, 51.593502044677734, 50.38835906982422, -52.33881759643555, -52.338809967041016, -51.59368896484375, -50.38816833496094, -52.338809967041016, -51.59368896484375, -50.38816833496094, -52.338809967041016, -51.59368896484375, -50.38816833496094, -52.338809967041016, -51.59368896484375, -50.38816833496094, -33.09198760986328, -82.73540496826172, 0.00012155366130173206, -33.09198760986328, -82.73540496826172, 0.00012155366130173206, -33.09198760986328, -82.73540496826172, 0.00012155366130173206, -33.09198760986328, -82.73540496826172, 0.00012155366130173206, -83.48023223876953, -1.2053337097167969, 31.14202308654785, -83.48023223876953, -1.2053337097167969, 31.14202308654785, -83.48023223876953, -1.2053337097167969, 31.14202308654785, -83.48023223876953, -1.2053337097167969, 31.14202308654785, -50.3885498046875, -52.338626861572266, -51.593505859375, -50.3885498046875, -52.338626861572266, -51.593505859375, -50.3885498046875, -52.338626861572266, -51.593505859375, -50.3885498046875, -52.338626861572266, -51.593505859375, -0.000303904089378193, -33.09198760986328, -82.73540496826172, -0.000303904089378193, -33.09198760986328, -82.73540496826172, -0.000303904089378193, -33.09198760986328, -82.73540496826172, -0.000303904089378193, -33.09198760986328, -82.73540496826172, 50.38816833496094, -52.338626861572266, -51.593875885009766, 50.38816833496094, -52.338626861572266, -51.593875885009766, 50.38816833496094, -52.338626861572266, -51.593875885009766, 50.38816833496094, -52.338626861572266, -51.593875885009766, 31.141719818115234, -83.4803466796875, 1.2052193880081177, 31.141719818115234, -83.4803466796875, 1.2052193880081177, 31.141719818115234, -83.4803466796875, 1.2052193880081177, 31.141719818115234, -83.4803466796875, 1.2052193880081177, -31.141719818115234, -83.4803466796875, -1.2052193880081177, -31.141719818115234, -83.4803466796875, -1.2052193880081177, -31.141719818115234, -83.4803466796875, -1.2052193880081177, -31.141719818115234, -83.4803466796875, -1.2052193880081177, 1.2050271034240723, -31.14171600341797, -83.48035430908203, 1.2050271034240723, -31.14171600341797, -83.48035430908203, 1.2050271034240723, -31.14171600341797, -83.48035430908203, 1.2050271034240723, -31.14171600341797, -83.48035430908203, -52.338809967041016, 51.59368896484375, -50.38816833496094, -52.338809967041016, 51.59368896484375, -50.38816833496094, -52.338809967041016, 51.59368896484375, -50.38816833496094, -52.338809967041016, 51.59368896484375, -50.38816833496094, -31.141712188720703, -83.4803466796875, 1.2054481506347656, -31.141712188720703, -83.4803466796875, 1.2054481506347656, -31.141712188720703, -83.4803466796875, 1.2054481506347656, -31.141712188720703, -83.4803466796875, 1.2054481506347656, 31.141719818115234, 83.4803466796875, 1.2052193880081177, 31.141719818115234, 83.4803466796875, 1.2052193880081177, 31.141719818115234, 83.4803466796875, 1.2052193880081177, 31.141719818115234, 83.4803466796875, 1.2052193880081177, 33.09198760986328, 82.73540496826172, -0.00012155366130173206, 33.09198760986328, 82.73540496826172, -0.00012155366130173206, 33.09198760986328, 82.73540496826172, -0.00012155366130173206, 33.09198760986328, 82.73540496826172, -0.00012155366130173206, 31.141712188720703, -83.4803466796875, -1.2054481506347656, 31.141712188720703, -83.4803466796875, -1.2054481506347656, 31.141712188720703, -83.4803466796875, -1.2054481506347656, 31.141712188720703, -83.4803466796875, -1.2054481506347656, 1.205640435218811, 31.14171600341797, 83.48033142089844, 1.205640435218811, 31.14171600341797, 83.48033142089844, 1.205640435218811, 31.14171600341797, 83.48033142089844, 1.205640435218811, 31.14171600341797, 83.48033142089844, 0.000303904089378193, -33.09198760986328, 82.73540496826172, 0.000303904089378193, -33.09198760986328, 82.73540496826172, 0.000303904089378193, -33.09198760986328, 82.73540496826172, 0.000303904089378193, -33.09198760986328, 82.73540496826172, -82.73552703857422, 0, -33.0916862487793, -82.73552703857422, 0, -33.0916862487793, -82.73552703857422, 0, -33.0916862487793, -82.73552703857422, 0, -33.0916862487793, -51.59387969970703, 50.38835906982422, -52.338436126708984, -51.59387969970703, 50.38835906982422, -52.338436126708984, -51.59387969970703, 50.38835906982422, -52.338436126708984, -51.59387969970703, 50.38835906982422, -52.338436126708984, 52.33843994140625, 51.59368896484375, -50.3885498046875, 52.33843994140625, 51.59368896484375, -50.3885498046875, 52.33843994140625, 51.59368896484375, -50.3885498046875, 52.33843994140625, 51.59368896484375, -50.3885498046875, 51.59387969970703, -50.38835906982422, 52.338436126708984, 51.59387969970703, -50.38835906982422, 52.338436126708984, 51.59387969970703, -50.38835906982422, 52.338436126708984, 51.59387969970703, -50.38835906982422, 52.338436126708984, 50.3885498046875, -52.338626861572266, 51.593505859375, 50.3885498046875, -52.338626861572266, 51.593505859375, 50.3885498046875, -52.338626861572266, 51.593505859375, 50.3885498046875, -52.338626861572266, 51.593505859375],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-0.010959841310977936, 0.8584385514259338, -0.5127993226051331, -0.010959841310977936, 0.8584385514259338, -0.5127993226051331, -0.010959841310977936, 0.8584385514259338, -0.5127993226051331, -0.010959841310977936, 0.8584385514259338, -0.5127993226051331, 0.8584375977516174, -0.5128011703491211, -0.010949048213660717, 0.8584375977516174, -0.5128011703491211, -0.010949048213660717, 0.8584375977516174, -0.5128011703491211, -0.010949048213660717, 0.8584375977516174, -0.5128011703491211, -0.010949048213660717, 0.8584346175193787, -0.5128057599067688, 0.010964557528495789, 0.8584346175193787, -0.5128057599067688, 0.010964557528495789, 0.8584346175193787, -0.5128057599067688, 0.010964557528495789, 0.8584346175193787, -0.5128057599067688, 0.010964557528495789, -0.5414749979972839, -0.00002707540988922119, 0.8407168388366699, -0.5414749979972839, -0.00002707540988922119, 0.8407168388366699, -0.5414749979972839, -0.00002707540988922119, 0.8407168388366699, -0.5414749979972839, -0.00002707540988922119, 0.8407168388366699, 0.5305333137512207, 0.017743051052093506, 0.8474783301353455, 0.5305333137512207, 0.017743051052093506, 0.8474783301353455, 0.5305333137512207, 0.017743051052093506, 0.8474783301353455, 0.5305333137512207, 0.017743051052093506, 0.8474783301353455, 0.01774728298187256, 0.8474791646003723, 0.5305318236351013, 0.01774728298187256, 0.8474791646003723, 0.5305318236351013, 0.01774728298187256, 0.8474791646003723, 0.5305318236351013, 0.01774728298187256, 0.8474791646003723, 0.5305318236351013, -0.010942935943603516, 0.8584372997283936, 0.5128018856048584, -0.010942935943603516, 0.8584372997283936, 0.5128018856048584, -0.010942935943603516, 0.8584372997283936, 0.5128018856048584, -0.010942935943603516, 0.8584372997283936, 0.5128018856048584, 0.8584451079368591, 0.5127884149551392, -0.01095967274159193, 0.8584451079368591, 0.5127884149551392, -0.01095967274159193, 0.8584451079368591, 0.5127884149551392, -0.01095967274159193, 0.8584451079368591, 0.5127884149551392, -0.01095967274159193, -0.8584290742874146, -0.512814462184906, -0.010995045304298401, -0.8584290742874146, -0.512814462184906, -0.010995045304298401, -0.8584290742874146, -0.512814462184906, -0.010995045304298401, -0.8584290742874146, -0.512814462184906, -0.010995045304298401, -0.5305572152137756, -0.017733842134475708, -0.8474634885787964, -0.5305572152137756, -0.017733842134475708, -0.8474634885787964, -0.5305572152137756, -0.017733842134475708, -0.8474634885787964, -0.5305572152137756, -0.017733842134475708, -0.8474634885787964, -0.5128048658370972, 0.010960124433040619, -0.8584352135658264, -0.5128048658370972, 0.010960124433040619, -0.8584352135658264, -0.5128048658370972, 0.010960124433040619, -0.8584352135658264, -0.5128048658370972, 0.010960124433040619, -0.8584352135658264, -0.5128147006034851, -0.010991238057613373, -0.858428955078125, -0.5128147006034851, -0.010991238057613373, -0.858428955078125, -0.5128147006034851, -0.010991238057613373, -0.858428955078125, -0.5128147006034851, -0.010991238057613373, -0.858428955078125, 0.5127923488616943, 0.010975174605846405, -0.8584426045417786, 0.5127923488616943, 0.010975174605846405, -0.8584426045417786, 0.5127923488616943, 0.010975174605846405, -0.8584426045417786, 0.5127923488616943, 0.010975174605846405, -0.8584426045417786, -0.8584410548210144, 0.512795627117157, -0.010933354496955872, -0.8584410548210144, 0.512795627117157, -0.010933354496955872, -0.8584410548210144, 0.512795627117157, -0.010933354496955872, -0.8584410548210144, 0.512795627117157, -0.010933354496955872, -0.8584320545196533, 0.5128099322319031, 0.01097819209098816, -0.8584320545196533, 0.5128099322319031, 0.01097819209098816, -0.8584320545196533, 0.5128099322319031, 0.01097819209098816, -0.8584320545196533, 0.5128099322319031, 0.01097819209098816, -0.01773303747177124, -0.8474655151367188, 0.5305542349815369, -0.01773303747177124, -0.8474655151367188, 0.5305542349815369, -0.01773303747177124, -0.8474655151367188, 0.5305542349815369, -0.01773303747177124, -0.8474655151367188, 0.5305542349815369, 0.010984241962432861, 0.8584214448928833, -0.5128273963928223, 0.010984241962432861, 0.8584214448928833, -0.5128273963928223, 0.010984241962432861, 0.8584214448928833, -0.5128273963928223, 0.010984241962432861, 0.8584214448928833, -0.5128273963928223, -0.017747551202774048, 0.847478985786438, -0.5305322408676147, -0.017747551202774048, 0.847478985786438, -0.5305322408676147, -0.017747551202774048, 0.847478985786438, -0.5305322408676147, -0.017747551202774048, 0.847478985786438, -0.5305322408676147, 0.017701515927910805, 0.8474764823913574, -0.5305377244949341, 0.017701515927910805, 0.8474764823913574, -0.5305377244949341, 0.017701515927910805, 0.8474764823913574, -0.5305377244949341, 0.017701515927910805, 0.8474764823913574, -0.5305377244949341, -0.00002969801425933838, 0.840691328048706, -0.54151451587677, -0.00002969801425933838, 0.840691328048706, -0.54151451587677, -0.00002969801425933838, 0.840691328048706, -0.54151451587677, -0.00002969801425933838, 0.840691328048706, -0.54151451587677, 0.5415211915969849, 0.000026792287826538086, 0.840687096118927, 0.5415211915969849, 0.000026792287826538086, 0.840687096118927, 0.5415211915969849, 0.000026792287826538086, 0.840687096118927, 0.5415211915969849, 0.000026792287826538086, 0.840687096118927, 0.8474524617195129, -0.5305749177932739, 0.01773586869239807, 0.8474524617195129, -0.5305749177932739, 0.01773586869239807, 0.8474524617195129, -0.5305749177932739, 0.01773586869239807, 0.8474524617195129, -0.5305749177932739, 0.01773586869239807, 0.8584384322166443, 0.5127996206283569, 0.010955426841974258, 0.8584384322166443, 0.5127996206283569, 0.010955426841974258, 0.8584384322166443, 0.5127996206283569, 0.010955426841974258, 0.8584384322166443, 0.5127996206283569, 0.010955426841974258, 0.8474904298782349, -0.530514657497406, -0.01772182434797287, 0.8474904298782349, -0.530514657497406, -0.01772182434797287, 0.8474904298782349, -0.530514657497406, -0.01772182434797287, 0.8474904298782349, -0.530514657497406, -0.01772182434797287, 0.5305161476135254, -0.017740633338689804, -0.8474891185760498, 0.5305161476135254, -0.017740633338689804, -0.8474891185760498, 0.5305161476135254, -0.017740633338689804, -0.8474891185760498, 0.5305161476135254, -0.017740633338689804, -0.8474891185760498, 0.5414748787879944, -0.000005863606929779053, -0.8407169580459595, 0.5414748787879944, -0.000005863606929779053, -0.8407169580459595, 0.5414748787879944, -0.000005863606929779053, -0.8407169580459595, 0.5414748787879944, -0.000005863606929779053, -0.8407169580459595, 0.8406915068626404, -0.5415142774581909, -0.00000934302806854248, 0.8406915068626404, -0.5415142774581909, -0.00000934302806854248, 0.8406915068626404, -0.5415142774581909, -0.00000934302806854248, 0.8406915068626404, -0.5415142774581909, -0.00000934302806854248, -0.5128104090690613, -0.01098555326461792, 0.8584316372871399, -0.5128104090690613, -0.01098555326461792, 0.8584316372871399, -0.5128104090690613, -0.01098555326461792, 0.8584316372871399, -0.5128104090690613, -0.01098555326461792, 0.8584316372871399, -0.5128028988838196, 0.010992184281349182, 0.858436107635498, -0.5128028988838196, 0.010992184281349182, 0.858436107635498, -0.5128028988838196, 0.010992184281349182, 0.858436107635498, -0.5128028988838196, 0.010992184281349182, 0.858436107635498, -0.8474770188331604, -0.5305349826812744, 0.017758265137672424, -0.8474770188331604, -0.5305349826812744, 0.017758265137672424, -0.8474770188331604, -0.5305349826812744, 0.017758265137672424, -0.8474770188331604, -0.5305349826812744, 0.017758265137672424, -0.5305088758468628, -0.017743252217769623, 0.8474936485290527, -0.5305088758468628, -0.017743252217769623, 0.8474936485290527, -0.5305088758468628, -0.017743252217769623, 0.8474936485290527, -0.5305088758468628, -0.017743252217769623, 0.8474936485290527, -0.5305161476135254, 0.017740704119205475, 0.8474891781806946, -0.5305161476135254, 0.017740704119205475, 0.8474891781806946, -0.5305161476135254, 0.017740704119205475, 0.8474891781806946, -0.5305161476135254, 0.017740704119205475, 0.8474891781806946, -0.8474623560905457, 0.5305585861206055, 0.01774775981903076, -0.8474623560905457, 0.5305585861206055, 0.01774775981903076, -0.8474623560905457, 0.5305585861206055, 0.01774775981903076, -0.8474623560905457, 0.5305585861206055, 0.01774775981903076, 0.000029221177101135254, 0.8406913876533508, 0.5415146350860596, 0.000029221177101135254, 0.8406913876533508, 0.5415146350860596, 0.000029221177101135254, 0.8406913876533508, 0.5415146350860596, 0.000029221177101135254, 0.8406913876533508, 0.5415146350860596, 0.8474631309509277, 0.5305578112602234, 0.017742618918418884, 0.8474631309509277, 0.5305578112602234, 0.017742618918418884, 0.8474631309509277, 0.5305578112602234, 0.017742618918418884, 0.8474631309509277, 0.5305578112602234, 0.017742618918418884, 0.5128002166748047, -0.010964479297399521, 0.8584378957748413, 0.5128002166748047, -0.010964479297399521, 0.8584378957748413, 0.5128002166748047, -0.010964479297399521, 0.8584378957748413, 0.5128002166748047, -0.010964479297399521, 0.8584378957748413, -0.8407147526741028, 0.5414782166481018, 0.000009499490261077881, -0.8407147526741028, 0.5414782166481018, 0.000009499490261077881, -0.8407147526741028, 0.5414782166481018, 0.000009499490261077881, -0.8407147526741028, 0.5414782166481018, 0.000009499490261077881, -0.017701396718621254, 0.847476601600647, 0.530537486076355, -0.017701396718621254, 0.847476601600647, 0.530537486076355, -0.017701396718621254, 0.847476601600647, 0.530537486076355, -0.017701396718621254, 0.847476601600647, 0.530537486076355, 0.5305255055427551, 0.01773667335510254, -0.8474833369255066, 0.5305255055427551, 0.01773667335510254, -0.8474833369255066, 0.5305255055427551, 0.01773667335510254, -0.8474833369255066, 0.5305255055427551, 0.01773667335510254, -0.8474833369255066, -0.8474682569503784, -0.5305496454238892, -0.017742810770869255, -0.8474682569503784, -0.5305496454238892, -0.017742810770869255, -0.8474682569503784, -0.5305496454238892, -0.017742810770869255, -0.8474682569503784, -0.5305496454238892, -0.017742810770869255, -0.8406901359558105, -0.5415164232254028, 0.00003986060619354248, -0.8406901359558105, -0.5415164232254028, 0.00003986060619354248, -0.8406901359558105, -0.5415164232254028, 0.00003986060619354248, -0.8406901359558105, -0.5415164232254028, 0.00003986060619354248, -0.858434796333313, -0.5128055810928345, 0.010956216603517532, -0.858434796333313, -0.5128055810928345, 0.010956216603517532, -0.858434796333313, -0.5128055810928345, 0.010956216603517532, -0.858434796333313, -0.5128055810928345, 0.010956216603517532, -0.017747780308127403, -0.8474676012992859, -0.530550479888916, -0.017747780308127403, -0.8474676012992859, -0.530550479888916, -0.017747780308127403, -0.8474676012992859, -0.530550479888916, -0.017747780308127403, -0.8474676012992859, -0.530550479888916, 0.000033095479011535645, -0.8406911492347717, -0.5415149331092834, 0.000033095479011535645, -0.8406911492347717, -0.5415149331092834, 0.000033095479011535645, -0.8406911492347717, -0.5415149331092834, 0.000033095479011535645, -0.8406911492347717, -0.5415149331092834, 0.017742261290550232, -0.8474804759025574, -0.5305300354957581, 0.017742261290550232, -0.8474804759025574, -0.5305300354957581, 0.017742261290550232, -0.8474804759025574, -0.5305300354957581, 0.017742261290550232, -0.8474804759025574, -0.5305300354957581, 0.010982692241668701, -0.8584359288215637, 0.5128030776977539, 0.010982692241668701, -0.8584359288215637, 0.5128030776977539, 0.010982692241668701, -0.8584359288215637, 0.5128030776977539, 0.010982692241668701, -0.8584359288215637, 0.5128030776977539, -0.011000136844813824, -0.8584293127059937, -0.512813925743103, -0.011000136844813824, -0.8584293127059937, -0.512813925743103, -0.011000136844813824, -0.8584293127059937, -0.512813925743103, -0.011000136844813824, -0.8584293127059937, -0.512813925743103, 0.5127899050712585, -0.010951489210128784, -0.858444333076477, 0.5127899050712585, -0.010951489210128784, -0.858444333076477, 0.5127899050712585, -0.010951489210128784, -0.858444333076477, 0.5127899050712585, -0.010951489210128784, -0.858444333076477, -0.8474836945533752, 0.530524492263794, -0.017755359411239624, -0.8474836945533752, 0.530524492263794, -0.017755359411239624, -0.8474836945533752, 0.530524492263794, -0.017755359411239624, -0.8474836945533752, 0.530524492263794, -0.017755359411239624, -0.010949179530143738, -0.8584410548210144, 0.5127953290939331, -0.010949179530143738, -0.8584410548210144, 0.5127953290939331, -0.010949179530143738, -0.8584410548210144, 0.5127953290939331, -0.010949179530143738, -0.8584410548210144, 0.5127953290939331, 0.010959796607494354, 0.8584384918212891, 0.5127993226051331, 0.010959796607494354, 0.8584384918212891, 0.5127993226051331, 0.010959796607494354, 0.8584384918212891, 0.5127993226051331, 0.010959796607494354, 0.8584384918212891, 0.5127993226051331, 0.840688943862915, 0.5415182709693909, 0.0000023245811462402344, 0.840688943862915, 0.5415182709693909, 0.0000023245811462402344, 0.840688943862915, 0.5415182709693909, 0.0000023245811462402344, 0.840688943862915, 0.5415182709693909, 0.0000023245811462402344, 0.010956525802612305, -0.85843825340271, -0.512799859046936, 0.010956525802612305, -0.85843825340271, -0.512799859046936, 0.010956525802612305, -0.85843825340271, -0.512799859046936, 0.010956525802612305, -0.85843825340271, -0.512799859046936, 0.5128072500228882, 0.010947109200060368, 0.8584340214729309, 0.5128072500228882, 0.010947109200060368, 0.8584340214729309, 0.5128072500228882, 0.010947109200060368, 0.8584340214729309, 0.5128072500228882, 0.010947109200060368, 0.8584340214729309, -0.00002372264862060547, -0.8406915664672852, 0.5415141582489014, -0.00002372264862060547, -0.8406915664672852, 0.5415141582489014, -0.00002372264862060547, -0.8406915664672852, 0.5415141582489014, -0.00002372264862060547, -0.8406915664672852, 0.5415141582489014, -0.5415211319923401, 0.0000058785080909729, -0.8406871557235718, -0.5415211319923401, 0.0000058785080909729, -0.8406871557235718, -0.5415211319923401, 0.0000058785080909729, -0.8406871557235718, -0.5415211319923401, 0.0000058785080909729, -0.8406871557235718, -0.5305268168449402, 0.017754971981048584, -0.8474822044372559, -0.5305268168449402, 0.017754971981048584, -0.8474822044372559, -0.5305268168449402, 0.017754971981048584, -0.8474822044372559, -0.5305268168449402, 0.017754971981048584, -0.8474822044372559, 0.8474643230438232, 0.530555784702301, -0.017738506197929382, 0.8474643230438232, 0.530555784702301, -0.017738506197929382, 0.8474643230438232, 0.530555784702301, -0.017738506197929382, 0.8474643230438232, 0.530555784702301, -0.017738506197929382, 0.5305773615837097, -0.017735809087753296, 0.8474509716033936, 0.5305773615837097, -0.017735809087753296, 0.8474509716033936, 0.5305773615837097, -0.017735809087753296, 0.8474509716033936, 0.5305773615837097, -0.017735809087753296, 0.8474509716033936, 0.017751533538103104, -0.8474733233451843, 0.5305410623550415, 0.017751533538103104, -0.8474733233451843, 0.5305410623550415, 0.017751533538103104, -0.8474733233451843, 0.5305410623550415, 0.017751533538103104, -0.8474733233451843, 0.5305410623550415],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.04446648806333542, 0.07376205921173096, 0.20145824551582336, 0.23582905530929565, 0.21539996564388275, 0.12743210792541504, 0.37534299492836, 0.25084298849105835, 0.04809992015361786, 0.08560597896575928, 0.057846054434776306, 0.11768478155136108, 0.1833210289478302, 0.12743109464645386, 0.7991840243339539, 0.7345119714736938, 0.04446648806333542, 0.10164541006088257, 0.05784609913825989, 0.009287774562835693, 0.1456916183233261, 0.009287774562835693, 0.9510290026664734, 0.7345119714736938, 0.029962755739688873, 0.009287834167480469, 0.08629150688648224, 0.11558711528778076, 0.16937947273254395, 0.23582905530929565, 0.29914700984954834, 0.9847790002822876, 0.09967105835676193, 0.11768478155136108, 0.12479200214147568, 0.5006319880485535, 0.13174988329410553, 0.06191825866699219, 0.14569158852100372, 0.23582911491394043, 0.10386674106121063, 0.11768478155136108, 0.1178082525730133, 0.12743109464645386, 0.12811647355556488, 0.059820473194122314, 0.2996180057525635, 0.7345709800720215, 0.04809992015361786, 0.07166439294815063, 0.1038665845990181, 0.12743091583251953, 0.2112043797969818, 0.12743210792541504, 0.4983850121498108, 0.5901579856872559, 0.04809992015361786, 0.08980154991149902, 0.04809992015361786, 0.1274309754371643, 0.06204163283109665, 0.11768478155136108, 0.9510089755058289, 0.23450398445129395, 0.04809992015361786, 0.11348932981491089, 0.07598327845335007, 0.11768478155136108, 0.11361270397901535, 0.11768472194671631, 0.24789699912071228, 0.8405579924583435, 0.1178082674741745, 0.009287655353546143, 0.15963312983512878, 0.23582905530929565, 0.2148379236459732, 0.11348950862884521, 0.7521880269050598, 0.34043699502944946, 0.04446648806333542, 0.04587888717651367, 0.22514608502388, 0.00928884744644165, 0.2390877902507782, 0.23582905530929565, 0.9978780150413513, 0.34043699502944946, 0.12811647355556488, 0.08770370483398438, 0.15963324904441833, 0.12743109464645386, 0.23908784985542297, 0.12743210792541504, 0.8750330209732056, 0.25118499994277954, 0.04809989035129547, 0.0437811017036438, 0.22934159636497498, 0.12743210792541504, 0.24328330159187317, 0.23582911491394043, 0.5490679740905762, 0.2342810034751892, 0.04446648806333542, 0.11558705568313599, 0.0717877745628357, 0.11768478155136108, 0.12755444645881653, 0.12743091583251953, 0.20090700685977936, 0.4844740033149719, 0.03415820747613907, 0.009287834167480469, 0.07178772985935211, 0.009287774562835693, 0.08992494642734528, 0.11768484115600586, 0.24783000349998474, 0.3400610089302063, 0.029962942004203796, 0.1274297833442688, 0.08629149198532104, 0.05982053279876709, 0.17357508838176727, 0.009289085865020752, 0.7481870055198669, 0.5902109742164612, 0.07598324865102768, 0.12743091583251953, 0.13174989819526672, 0.10374313592910767, 0.2153998762369156, 0.23582905530929565, 0.25249800086021423, 0.34009504318237305, 0.08629149198532104, 0.07376205921173096, 0.20145824551582336, 0.1274312138557434, 0.22934159636497498, 0.11768591403961182, 0.49818700551986694, 0.34009504318237305, 0.04446648806333542, 0.05982053279876709, 0.07598326355218887, 0.23582905530929565, 0.22514608502388, 0.23582905530929565, 0.29941999912261963, 0.48450803756713867, 0.04809989035129547, 0.04797661304473877, 0.2251461148262024, 0.12743210792541504, 0.22934159636497498, 0.009288787841796875, 0.45126500725746155, 0.48450803756713867, 0.04809992015361786, 0.0995476245880127, 0.14149606227874756, 0.009287774562835693, 0.14569158852100372, 0.12743109464645386, 0.24763700366020203, 0.5898839831352234, 0.08572941273450851, 0.23582905530929565, 0.12811647355556488, 0.04587888717651367, 0.1456916183233261, 0.11768472194671631, 0.9979509711265564, 0.5900989770889282, 0.04809992015361786, 0.10374313592910767, 0.062041595578193665, 0.009287774562835693, 0.14149613678455353, 0.12743109464645386, 0.7991650104522705, 0.23450398445129395, 0.08629149198532104, 0.04587888717651367, 0.18332113325595856, 0.23582911491394043, 0.2014583796262741, 0.11768490076065063, 0.7522619962692261, 0.5900989770889282, 0.08992491662502289, 0.0437811017036438, 0.18751657009124756, 0.23582905530929565, 0.23908784985542297, 0.11768591403961182, 0.6249899864196777, 0.0006160140037536621, 0.043904468417167664, 0.1274309754371643, 0.0444665253162384, 0.08770382404327393, 0.18751657009124756, 0.12743109464645386, 0.7478349804878235, 0.08986800909042358, 0.08572938293218613, 0.1274309754371643, 0.13174991309642792, 0.0758599042892456, 0.2014583796262741, 0.009289026260375977, 0.8751059770584106, 0.5008469820022583, 0.034158237278461456, 0.23582905530929565, 0.0899249017238617, 0.10374313592910767, 0.15543770790100098, 0.11768490076065063, 0.49791398644447327, 0.840366005897522, 0.020216554403305054, 0.1274297833442688, 0.13174991309642792, 0.11768472194671631, 0.15543778240680695, 0.009287893772125244, 0.3750689923763275, 0.751114010810852, 0.04913000017404556, 0.9849709868431091, 0.0899249017238617, 0.05772274732589722, 0.1693795919418335, 0.009289145469665527, 0.17357489466667175, 0.12743103504180908, 0.034158237278461456, 0.1274297833442688, 0.0899249017238617, 0.06191825866699219, 0.16937938332557678, 0.1274309754371643, 0.45099198818206787, 0.9847790002822876, 0.020216554403305054, 0.23582911491394043, 0.029962696135044098, 0.11768358945846558, 0.2148379534482956, 0.0995478630065918, 0.25222501158714294, 0.840366005897522, 0.034158363938331604, 0.11768358945846558, 0.09967107325792313, 0.23582905530929565, 0.12498500198125839, 0.2508090138435364, 0.2148379534482956, 0.10374337434768677, 0.016021236777305603, 0.1274297833442688, 0.10386674106121063, 0.009288907051086426, 0.12811647355556488, 0.11558699607849121, 0.2526949942111969, 0.5901579856872559, 0.1136128157377243, 0.12743109464645386, 0.13174988329410553, 0.05772268772125244, 0.14149603247642517, 0.23582905530929565, 0.7522420287132263, 0.09009099006652832, 0.020216554403305054, 0.009286701679229736, 0.04887000098824501, 0.734296977519989, 0.08629149198532104, 0.10164541006088257, 0.15963326394557953, 0.11768490076065063, 0.002139999996870756, 0.3400610089302063, 0.04809992015361786, 0.0758599042892456, 0.0996711403131485, 0.12743091583251953, 0.197262704372406, 0.23582911491394043, 0.016021013259887695, 0.23582905530929565, 0.1038665771484375, 0.23582905530929565, 0.21120451390743256, 0.1016455888748169, 0.37553998827934265, 0.5009059906005859, 0.043904371559619904, 0.23582905530929565, 0.04809992015361786, 0.05772274732589722, 0.22934159636497498, 0.23582905530929565, 0.7009119987487793, 0.2342810034751892, 0.057846151292324066, 0.23582905530929565, 0.11361275613307953, 0.009287714958190918, 0.12505200505256653, 0.7513059973716736, 0.2148379236459732, 0.11768490076065063, 0.0022070000413805246, 0.8405579924583435, 0.057846054434776306, 0.1274309754371643, 0.08629149198532104, 0.08770382404327393, 0.16937938332557678, 0.11768496036529541, 0.07598327845335007, 0.009287774562835693, 0.08992494642734528, 0.11348938941955566, 0.17357489466667175, 0.23582911491394043, 0.2009740024805069, 0.9849709868431091, 0.06204158067703247, 0.23582905530929565, 0.15543770790100098, 0.23582905530929565, 0.21120451390743256, 0.11558717489242554, 0.5491099953651428, 0.48442399501800537, 0.13174989819526672, 0.08560597896575928, 0.15543770790100098, 0.12743109464645386, 0.24328330159187317, 0.009288966655731201, 0.7009549736976624, 0.48442399501800537, 0.08992491662502289, 0.04797661304473877, 0.1972629427909851, 0.11768496036529541, 0.24328330159187317, 0.11768591403961182, 0.7478770017623901, 0.3400120139122009, 0.08992493152618408, 0.1274309754371643, 0.13174991309642792, 0.07166433334350586, 0.18751657009124756, 0.11768484115600586, 0.5024970173835754, 0.5902109742164612, 0.06204158067703247, 0.1274309754371643, 0.08992491662502289, 0.0898016095161438, 0.18332108855247498, 0.009287834167480469, 0.5021880269050598, 0.3400120139122009, 0.13174989819526672, 0.08980154991149902, 0.2390877902507782, 0.009288907051086426, 0.24328330159187317, 0.12743210792541504, 0.502144992351532, 0.08986800909042358, 0.049063000828027725, 0.4844740033149719, 0.0899249017238617, 0.07166439294815063, 0.12755438685417175, 0.23582905530929565, 0.19726276397705078, 0.1274312138557434, 0.08992491662502289, 0.08560603857040405, 0.17357507348060608, 0.11768496036529541, 0.18751657009124756, 0.009287834167480469, 0.6253420114517212, 0.5009589791297913, 0.1178082600235939, 0.23582905530929565, 0.13174989819526672, 0.0995476245880127, 0.2112043797969818, 0.23582905530929565, 0.4514620006084442, 0.7345709800720215, 0.07178780436515808, 0.1274309754371643, 0.11361271142959595, 0.23582905530929565, 0.12811647355556488, 0.10164541006088257, 0.8750870227813721, 0.0008389949798583984, 0.12811648845672607, 0.07376205921173096, 0.1833210289478302, 0.11768484115600586, 0.197262704372406, 0.009289026260375977, 0.6250330209732056, 0.25075995922088623, 0.0019470000406727195, 0.5898839831352234, 0.09967128932476044, 0.009288907051086426, 0.13174991309642792, 0.11348927021026611, 0.15963326394557953, 0.009287893772125244, 0.01602097600698471, 0.009286701679229736, 0.029962696135044098, 0.23582905530929565, 0.0899249017238617, 0.0995476245880127, 0.7012640237808228, 0.7346240282058716, 0.04809992015361786, 0.11768478155136108, 0.1178082674741745, 0.11768472194671631, 0.13174991309642792, 0.12743091583251953, 0.799111008644104, 0.4848499894142151, 0.0899249017238617, 0.0758599042892456, 0.13174991309642792, 0.23582911491394043, 0.22514614462852478, 0.11768591403961182, 0.9509549736976624, 0.4848499894142151, 0.04809992015361786, 0.06191825866699219, 0.04809992015361786, 0.23582905530929565, 0.07178771495819092, 0.23582905530929565, 0.9979320168495178, 0.09009099006652832, 0.020216554403305054, 0.11768358945846558, 0.13174989819526672, 0.047976553440093994, 0.14149612188339233, 0.11768472194671631, 0.20071400701999664, 0.734296977519989, 0.01602107286453247, 0.11768358945846558, 0.08992485702037811, 0.23582905530929565, 0.13174989819526672, 0.0437811017036438, 0.5494199991226196, 0.7346240282058716],\n \"normalized\": false\n },\n \"color\": {\n \"itemSize\": 4,\n \"type\": \"Uint16Array\",\n \"array\": [65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535],\n \"normalized\": true\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [17, 212, 141, 107, 7, 11, 43, 39, 223, 59, 130, 144, 158, 116, 167, 151, 23, 203, 91, 231, 207, 199, 183, 239, 75, 71, 3, 103, 191, 51, 171, 179, 211, 186, 182, 198, 149, 146, 129, 133, 16, 20, 108, 60, 217, 205, 21, 136, 157, 221, 36, 202, 2, 26, 119, 14, 166, 49, 74, 154, 161, 168, 184, 33, 57, 53, 178, 189, 98, 229, 100, 152, 102, 93, 97, 148, 112, 132, 232, 216, 236, 194, 222, 54, 173, 37, 45, 104, 237, 180, 138, 82, 90, 12, 128, 56, 86, 81, 234, 73, 204, 230, 46, 50, 190, 94, 210, 177, 147, 69, 195, 226, 78, 41, 9, 30, 89, 118, 197, 62, 0, 145, 24, 162, 185, 196, 65, 201, 206, 105, 181, 208, 76, 48, 40, 172, 44, 188, 113, 214, 134, 109, 218, 142, 32, 52, 220, 4, 101, 28, 13, 58, 165, 8, 88, 80, 68, 224, 193, 159, 38, 170, 72, 228, 153, 92, 176, 96, 126, 150, 131, 121, 117, 61, 18, 137, 22, 85, 233, 238, 114, 143, 215, 15, 111, 115, 235, 83, 141, 83, 17, 141, 11, 87, 107, 107, 95, 7, 223, 227, 43, 43, 47, 39, 192, 55, 144, 55, 59, 144, 167, 35, 158, 158, 160, 116, 203, 27, 151, 151, 135, 23, 207, 139, 91, 91, 31, 231, 219, 63, 239, 63, 199, 239, 3, 67, 75, 75, 79, 71, 51, 155, 103, 103, 99, 191, 211, 187, 171, 171, 175, 179, 186, 209, 182, 149, 25, 146, 133, 213, 16, 108, 120, 60, 205, 200, 21, 157, 34, 221, 202, 66, 2, 119, 122, 14, 49, 77, 74, 161, 156, 168, 33, 164, 57, 178, 174, 189, 229, 29, 100, 102, 6, 93, 148, 124, 112, 232, 140, 216, 194, 225, 222, 173, 169, 37, 104, 84, 237, 138, 19, 82, 12, 125, 128, 86, 10, 81, 73, 64, 204, 46, 42, 50, 94, 106, 210, 147, 1, 69, 226, 70, 78, 9, 5, 30, 118, 163, 197, 114, 110, 143, 115, 127, 15, 15, 123, 111]\n },\n \"boundingSphere\": {\n \"center\": [0, 0, 0],\n \"radius\": 144.59226795520192\n }\n },\n faceValues: [7, 5, 3, 11, 12, 9, 4, 1, 2, 10, 8, 6],\n rotationCombinations: {\n \"1,2\": [90, 0, -90],\n \"1,3\": [-90, 0, -90],\n \"1,4\": [-32, 18, -58],\n \"1,5\": [32, 18, 58],\n \"1,6\": [0, 0, 180],\n \"1,7\": [-180, 0, 0],\n \"1,8\": [-148, -18, -58],\n \"1,9\": [-148, -18, 122],\n \"1,10\": [-90, 0, 90],\n \"1,11\": [90, 0, 90],\n \"1,12\": [-180, 0, -180],\n \"2,3\": [-180, 0, -180],\n \"2,4\": [90, 0, -90],\n \"2,5\": [90, 0, 90],\n \"2,6\": [-122, -90, 148],\n \"2,7\": [-69, 30, 21],\n \"2,8\": [-90, 0, -90],\n \"2,9\": [-32, 18, 122],\n \"2,10\": [-180, 0, 0],\n \"2,11\": [0, 0, 180],\n \"2,12\": [-148, 54, 122],\n \"3,4\": [32, 18, 58],\n \"3,5\": [90, 0, -90],\n \"3,6\": [32, 54, -58],\n \"3,7\": [-32, -54, 122],\n \"3,8\": [-148, -18, 122],\n \"3,9\": [-90, 0, -90],\n \"3,10\": [-148, 18, -122],\n \"3,11\": [-180, 0, 0],\n \"3,12\": [-122, -90, 148],\n \"4,5\": [0, 0, 180],\n \"4,6\": [90, 0, 90],\n \"4,7\": [-90, 0, 90],\n \"4,8\": [-180, 0, -180],\n \"4,9\": [-180, 0, 0],\n \"4,10\": [148, -54, -58],\n \"4,11\": [-122, -90, 148],\n \"4,12\": [-90, 0, -90],\n \"5,6\": [-90, 0, -90],\n \"5,7\": [90, 0, -90],\n \"5,8\": [-180, 0, 0],\n \"5,9\": [-180, 0, -180],\n \"5,10\": [-148, -18, 122],\n \"5,11\": [32, 18, 58],\n \"5,12\": [90, 0, 90],\n \"6,7\": [-180, 0, -180],\n \"6,8\": [148, 18, 122],\n \"6,9\": [-122, -90, 148],\n \"6,10\": [90, 0, -90],\n \"6,11\": [-148, 54, -58],\n \"6,12\": [-148, -18, -58],\n \"7,8\": [32, -18, -58],\n \"7,9\": [-69, 30, 21],\n \"7,10\": [148, 54, 58],\n \"7,11\": [-90, 0, 90],\n \"7,12\": [-32, 54, 58],\n \"8,9\": [0, 0, 180],\n \"8,10\": [-148, -18, -58],\n \"8,11\": [-148, -54, 58],\n \"8,12\": [-90, 0, 90],\n \"9,10\": [-31, 18, -58],\n \"9,11\": [-148, -90, -58],\n \"9,12\": [90, 0, -90],\n \"10,11\": [-180, 0, -180],\n \"10,12\": [-90, 90, -180],\n \"11,12\": [148, -54, -58],\n }\n },\n \"d14\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"55E8EC8E-D9C5-4E75-86AC-BC4F49CF5FEA\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-3.3639726638793945,6.319602012634277,-77.80762481689453,-3.3639726638793945,6.319602012634277,-77.80762481689453,-3.3639726638793945,6.319602012634277,-77.80762481689453,-3.3639726638793945,6.319602012634277,-77.80762481689453,2.563892364501953,84.39848327636719,-5.970834732055664,2.563892364501953,84.39848327636719,-5.970834732055664,2.563892364501953,84.39848327636719,-5.970834732055664,2.563892364501953,84.39848327636719,-5.970834732055664,2.563892364501953,84.39848327636719,-5.970834732055664,75.92582702636719,-2.281585454940796,-17.299819946289062,75.92582702636719,-2.281585454940796,-17.299819946289062,75.92582702636719,-2.281585454940796,-17.299819946289062,75.92582702636719,-2.281585454940796,-17.299819946289062,4.9952239990234375,84.37457275390625,4.497790336608887,4.9952239990234375,84.37457275390625,4.497790336608887,4.9952239990234375,84.37457275390625,4.497790336608887,4.9952239990234375,84.37457275390625,4.497790336608887,4.9952239990234375,84.37457275390625,4.497790336608887,-30.552932739257812,6.355025291442871,71.34111022949219,-30.552932739257812,6.355025291442871,71.34111022949219,-30.552932739257812,6.355025291442871,71.34111022949219,-30.552932739257812,6.355025291442871,71.34111022949219,31.1562557220459,6.31425142288208,71.49166870117188,31.1562557220459,6.31425142288208,71.49166870117188,31.1562557220459,6.31425142288208,71.49166870117188,31.1562557220459,6.31425142288208,71.49166870117188,-74.74581909179688,-6.299898624420166,-20.404645919799805,-74.74581909179688,-6.299898624420166,-20.404645919799805,-74.74581909179688,-6.299898624420166,-20.404645919799805,-74.74581909179688,-6.299898624420166,-20.404645919799805,30.55293846130371,-6.35502815246582,-71.34111022949219,30.55293846130371,-6.35502815246582,-71.34111022949219,30.55293846130371,-6.35502815246582,-71.34111022949219,30.55293846130371,-6.35502815246582,-71.34111022949219,-31.1562557220459,-6.31424617767334,-71.49166870117188,-31.1562557220459,-6.31424617767334,-71.49166870117188,-31.1562557220459,-6.31424617767334,-71.49166870117188,-31.1562557220459,-6.31424617767334,-71.49166870117188,5.657160758972168,-84.42521667480469,-4.448384761810303,5.657160758972168,-84.42521667480469,-4.448384761810303,5.657160758972168,-84.42521667480469,-4.448384761810303,5.657160758972168,-84.42521667480469,-4.448384761810303,5.657160758972168,-84.42521667480469,-4.448384761810303,62.504119873046875,-6.354261875152588,46.30989074707031,62.504119873046875,-6.354261875152588,46.30989074707031,62.504119873046875,-6.354261875152588,46.30989074707031,62.504119873046875,-6.354261875152588,46.30989074707031,7.009031295776367,-84.40763854980469,1.33268404006958,7.009031295776367,-84.40763854980469,1.33268404006958,7.009031295776367,-84.40763854980469,1.33268404006958,7.009031295776367,-84.40763854980469,1.33268404006958,7.009031295776367,-84.40763854980469,1.33268404006958,75.9446792602539,-6.379278182983398,-14.266926765441895,75.9446792602539,-6.379278182983398,-14.266926765441895,75.9446792602539,-6.379278182983398,-14.266926765441895,75.9446792602539,-6.379278182983398,-14.266926765441895,3.3639724254608154,-6.31959867477417,77.8076171875,3.3639724254608154,-6.31959867477417,77.8076171875,3.3639724254608154,-6.31959867477417,77.8076171875,3.3639724254608154,-6.31959867477417,77.8076171875,3.3671836853027344,-84.35977935791016,6.014355659484863,3.3671836853027344,-84.35977935791016,6.014355659484863,3.3671836853027344,-84.35977935791016,6.014355659484863,3.3671836853027344,-84.35977935791016,6.014355659484863,3.3671836853027344,-84.35977935791016,6.014355659484863,34.1295166015625,2.239828109741211,70.8094711303711,34.1295166015625,2.239828109741211,70.8094711303711,34.1295166015625,2.239828109741211,70.8094711303711,34.1295166015625,2.239828109741211,70.8094711303711,-75.9446792602539,6.379278182983398,14.26693058013916,-75.9446792602539,6.379278182983398,14.26693058013916,-75.9446792602539,6.379278182983398,14.26693058013916,-75.9446792602539,6.379278182983398,14.26693058013916,-76.03756713867188,-6.302979946136475,-14.609931945800781,-76.03756713867188,-6.302979946136475,-14.609931945800781,-76.03756713867188,-6.302979946136475,-14.609931945800781,-76.03756713867188,-6.302979946136475,-14.609931945800781,-76.0564956665039,-2.211188554763794,-17.664764404296875,-76.0564956665039,-2.211188554763794,-17.664764404296875,-76.0564956665039,-2.211188554763794,-17.664764404296875,-76.0564956665039,-2.211188554763794,-17.664764404296875,-62.504119873046875,6.354262351989746,-46.30989074707031,-62.504119873046875,6.354262351989746,-46.30989074707031,-62.504119873046875,6.354262351989746,-46.30989074707031,-62.504119873046875,6.354262351989746,-46.30989074707031,-61.1809196472168,2.2734644412994385,-49.07624435424805,-61.1809196472168,2.2734644412994385,-49.07624435424805,-61.1809196472168,2.2734644412994385,-49.07624435424805,-61.1809196472168,2.2734644412994385,-49.07624435424805,-58.829193115234375,6.3529181480407715,-50.964759826660156,-58.829193115234375,6.3529181480407715,-50.964759826660156,-58.829193115234375,6.3529181480407715,-50.964759826660156,-58.829193115234375,6.3529181480407715,-50.964759826660156,-36.493858337402344,-6.314887523651123,-68.91082763671875,-36.493858337402344,-6.314887523651123,-68.91082763671875,-36.493858337402344,-6.314887523651123,-68.91082763671875,-36.493858337402344,-6.314887523651123,-68.91082763671875,58.31211471557617,6.307106018066406,-50.69571304321289,58.31211471557617,6.307106018066406,-50.69571304321289,58.31211471557617,6.307106018066406,-50.69571304321289,58.31211471557617,6.307106018066406,-50.69571304321289,62.011024475097656,6.3075995445251465,-46.048179626464844,62.011024475097656,6.3075995445251465,-46.048179626464844,62.011024475097656,6.3075995445251465,-46.048179626464844,62.011024475097656,6.3075995445251465,-46.048179626464844,74.60848999023438,-6.379120826721191,-20.05154037475586,74.60848999023438,-6.379120826721191,-20.05154037475586,74.60848999023438,-6.379120826721191,-20.05154037475586,74.60848999023438,-6.379120826721191,-20.05154037475586,76.0564956665039,2.2111899852752686,17.664772033691406,76.0564956665039,2.2111899852752686,17.664772033691406,76.0564956665039,2.2111899852752686,17.664772033691406,76.0564956665039,2.2111899852752686,17.664772033691406,74.74581909179688,6.299901008605957,20.404653549194336,74.74581909179688,6.299901008605957,20.404653549194336,74.74581909179688,6.299901008605957,20.404653549194336,74.74581909179688,6.299901008605957,20.404653549194336,36.493858337402344,6.3148884773254395,68.91082763671875,36.493858337402344,6.3148884773254395,68.91082763671875,36.493858337402344,6.3148884773254395,68.91082763671875,36.493858337402344,6.3148884773254395,68.91082763671875,-2.5638914108276367,-84.39848327636719,5.9708333015441895,-2.5638914108276367,-84.39848327636719,5.9708333015441895,-2.5638914108276367,-84.39848327636719,5.9708333015441895,-2.5638914108276367,-84.39848327636719,5.9708333015441895,-2.5638914108276367,-84.39848327636719,5.9708333015441895,0.3401651680469513,-84.3684310913086,-7.083171844482422,0.3401651680469513,-84.3684310913086,-7.083171844482422,0.3401651680469513,-84.3684310913086,-7.083171844482422,0.3401651680469513,-84.3684310913086,-7.083171844482422,0.3401651680469513,-84.3684310913086,-7.083171844482422,-5.657160758972168,84.42522430419922,4.448385238647461,-5.657160758972168,84.42522430419922,4.448385238647461,-5.657160758972168,84.42522430419922,4.448385238647461,-5.657160758972168,84.42522430419922,4.448385238647461,-5.657160758972168,84.42522430419922,4.448385238647461,-0.4000111222267151,2.242583751678467,-78.4876937866211,-0.4000111222267151,2.242583751678467,-78.4876937866211,-0.4000111222267151,2.242583751678467,-78.4876937866211,-0.4000111222267151,2.242583751678467,-78.4876937866211,-34.1295166015625,-2.239827871322632,-70.8094711303711,-34.1295166015625,-2.239827871322632,-70.8094711303711,-34.1295166015625,-2.239827871322632,-70.8094711303711,-34.1295166015625,-2.239827871322632,-70.8094711303711,2.5671069622039795,6.321245193481445,-77.7981948852539,2.5671069622039795,6.321245193481445,-77.7981948852539,2.5671069622039795,6.321245193481445,-77.7981948852539,2.5671069622039795,6.321245193481445,-77.7981948852539,60.691749572753906,2.211258888244629,-48.80388641357422,60.691749572753906,2.211258888244629,-48.80388641357422,60.691749572753906,2.211258888244629,-48.80388641357422,60.691749572753906,2.211258888244629,-48.80388641357422,35.8908576965332,-6.357795238494873,-68.75081634521484,35.8908576965332,-6.357795238494873,-68.75081634521484,35.8908576965332,-6.357795238494873,-68.75081634521484,35.8908576965332,-6.357795238494873,-68.75081634521484,33.49201583862305,-2.268580436706543,-70.65808868408203,33.49201583862305,-2.268580436706543,-70.65808868408203,33.49201583862305,-2.268580436706543,-70.65808868408203,33.49201583862305,-2.268580436706543,-70.65808868408203,76.03756713867188,6.302982807159424,14.609939575195312,76.03756713867188,6.302982807159424,14.609939575195312,76.03756713867188,6.302982807159424,14.609939575195312,76.03756713867188,6.302982807159424,14.609939575195312,61.1809196472168,-2.2734615802764893,49.07624435424805,61.1809196472168,-2.2734615802764893,49.07624435424805,61.1809196472168,-2.2734615802764893,49.07624435424805,61.1809196472168,-2.2734615802764893,49.07624435424805,-58.31211471557617,-6.307102203369141,50.69571304321289,-58.31211471557617,-6.307102203369141,50.69571304321289,-58.31211471557617,-6.307102203369141,50.69571304321289,-58.31211471557617,-6.307102203369141,50.69571304321289,-33.49201202392578,2.268582582473755,70.65808868408203,-33.49201202392578,2.268582582473755,70.65808868408203,-33.49201202392578,2.268582582473755,70.65808868408203,-33.49201202392578,2.268582582473755,70.65808868408203,-35.8908576965332,6.357793807983398,68.75082397460938,-35.8908576965332,6.357793807983398,68.75082397460938,-35.8908576965332,6.357793807983398,68.75082397460938,-35.8908576965332,6.357793807983398,68.75082397460938,-2.567105293273926,-6.321239948272705,77.7981948852539,-2.567105293273926,-6.321239948272705,77.7981948852539,-2.567105293273926,-6.321239948272705,77.7981948852539,-2.567105293273926,-6.321239948272705,77.7981948852539,0.40001073479652405,-2.242581844329834,78.4876937866211,0.40001073479652405,-2.242581844329834,78.4876937866211,0.40001073479652405,-2.242581844329834,78.4876937866211,0.40001073479652405,-2.242581844329834,78.4876937866211,-60.69174575805664,-2.211254835128784,48.803897857666016,-60.69174575805664,-2.211254835128784,48.803897857666016,-60.69174575805664,-2.211254835128784,48.803897857666016,-60.69174575805664,-2.211254835128784,48.803897857666016,-74.60848999023438,6.379125595092773,20.051544189453125,-74.60848999023438,6.379125595092773,20.051544189453125,-74.60848999023438,6.379125595092773,20.051544189453125,-74.60848999023438,6.379125595092773,20.051544189453125,-75.92582702636719,2.2815887928009033,17.29982566833496,-75.92582702636719,2.2815887928009033,17.29982566833496,-75.92582702636719,2.2815887928009033,17.29982566833496,-75.92582702636719,2.2815887928009033,17.29982566833496,-62.011024475097656,-6.307600975036621,46.04818344116211,-62.011024475097656,-6.307600975036621,46.04818344116211,-62.011024475097656,-6.307600975036621,46.04818344116211,-62.011024475097656,-6.307600975036621,46.04818344116211,-6.242546081542969,-84.4273681640625,1.3070549964904785,-6.242546081542969,-84.4273681640625,1.3070549964904785,-6.242546081542969,-84.4273681640625,1.3070549964904785,-6.242546081542969,-84.4273681640625,1.3070549964904785,-6.242546081542969,-84.4273681640625,1.3070549964904785,-4.99522066116333,-84.37457275390625,-4.497788429260254,-4.99522066116333,-84.37457275390625,-4.497788429260254,-4.99522066116333,-84.37457275390625,-4.497788429260254,-4.99522066116333,-84.37457275390625,-4.497788429260254,-4.99522066116333,-84.37457275390625,-4.497788429260254,58.829200744628906,-6.3529205322265625,50.964759826660156,58.829200744628906,-6.3529205322265625,50.964759826660156,58.829200744628906,-6.3529205322265625,50.964759826660156,58.829200744628906,-6.3529205322265625,50.964759826660156,-0.34016573429107666,84.3684310913086,7.083171844482422,-0.34016573429107666,84.3684310913086,7.083171844482422,-0.34016573429107666,84.3684310913086,7.083171844482422,-0.34016573429107666,84.3684310913086,7.083171844482422,-0.34016573429107666,84.3684310913086,7.083171844482422,6.242546081542969,84.4273681640625,-1.307053804397583,6.242546081542969,84.4273681640625,-1.307053804397583,6.242546081542969,84.4273681640625,-1.307053804397583,6.242546081542969,84.4273681640625,-1.307053804397583,6.242546081542969,84.4273681640625,-1.307053804397583,-3.3671834468841553,84.35977935791016,-6.0143561363220215,-3.3671834468841553,84.35977935791016,-6.0143561363220215,-3.3671834468841553,84.35977935791016,-6.0143561363220215,-3.3671834468841553,84.35977935791016,-6.0143561363220215,-3.3671834468841553,84.35977935791016,-6.0143561363220215,-7.009029865264893,84.40763854980469,-1.3326834440231323,-7.009029865264893,84.40763854980469,-1.3326834440231323,-7.009029865264893,84.40763854980469,-1.3326834440231323,-7.009029865264893,84.40763854980469,-1.3326834440231323,-7.009029865264893,84.40763854980469,-1.3326834440231323,-0.36670994758605957,87.28189849853516,0.20025108754634857,-0.36670994758605957,87.28189849853516,0.20025108754634857,-0.36670994758605957,87.28189849853516,0.20025108754634857,-0.36670994758605957,87.28189849853516,0.20025108754634857,-0.36670994758605957,87.28189849853516,0.20025108754634857,-0.36670994758605957,87.28189849853516,0.20025108754634857,-0.36670994758605957,87.28189849853516,0.20025108754634857,0.366711288690567,-87.28191375732422,-0.2002510279417038,0.366711288690567,-87.28191375732422,-0.2002510279417038,0.366711288690567,-87.28191375732422,-0.2002510279417038,0.366711288690567,-87.28191375732422,-0.2002510279417038,0.366711288690567,-87.28191375732422,-0.2002510279417038,0.366711288690567,-87.28191375732422,-0.2002510279417038,0.366711288690567,-87.28191375732422,-0.2002510279417038],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-0.28516727685928345,0.6296403408050537,-0.7226566076278687,-0.28516727685928345,0.6296403408050537,-0.7226566076278687,-0.28516727685928345,0.6296403408050537,-0.7226566076278687,-0.28516727685928345,0.6296403408050537,-0.7226566076278687,0.3280982971191406,0.6602655649185181,-0.6755744218826294,0.3280982971191406,0.6602655649185181,-0.6755744218826294,0.3280982971191406,0.6602655649185181,-0.6755744218826294,0.3280982971191406,0.6602655649185181,-0.6755744218826294,0.3280982971191406,0.6602655649185181,-0.6755744218826294,0.7842698693275452,0.5933358073234558,-0.18131035566329956,0.7842698693275452,0.5933358073234558,-0.18131035566329956,0.7842698693275452,0.5933358073234558,-0.18131035566329956,0.7842698693275452,0.5933358073234558,-0.18131035566329956,0.589374303817749,0.6605231761932373,0.46513107419013977,0.589374303817749,0.6605231761932373,0.46513107419013977,0.589374303817749,0.6605231761932373,0.46513107419013977,0.589374303817749,0.6605231761932373,0.46513107419013977,0.589374303817749,0.6605231761932373,0.46513107419013977,-0.059090327471494675,0.6272545456886292,0.7765694260597229,-0.059090327471494675,0.6272545456886292,0.7765694260597229,-0.059090327471494675,0.6272545456886292,0.7765694260597229,-0.059090327471494675,0.6272545456886292,0.7765694260597229,0.05634559690952301,0.6280144453048706,0.7761592268943787,0.05634559690952301,0.6280144453048706,0.7761592268943787,0.05634559690952301,0.6280144453048706,0.7761592268943787,0.05634559690952301,0.6280144453048706,0.7761592268943787,-0.6443470120429993,-0.6290098428726196,-0.43492940068244934,-0.6443470120429993,-0.6290098428726196,-0.43492940068244934,-0.6443470120429993,-0.6290098428726196,-0.43492940068244934,-0.6443470120429993,-0.6290098428726196,-0.43492940068244934,0.05909096822142601,-0.6272543668746948,-0.7765696048736572,0.05909096822142601,-0.6272543668746948,-0.7765696048736572,0.05909096822142601,-0.6272543668746948,-0.7765696048736572,0.05909096822142601,-0.6272543668746948,-0.7765696048736572,-0.05632945895195007,-0.6280063986778259,-0.7761667966842651,-0.05632945895195007,-0.6280063986778259,-0.7761667966842651,-0.05632945895195007,-0.6280063986778259,-0.7761667966842651,-0.05632945895195007,-0.6280063986778259,-0.7761667966842651,0.5910056829452515,-0.6553013920783997,-0.4704173803329468,0.5910056829452515,-0.6553013920783997,-0.4704173803329468,0.5910056829452515,-0.6553013920783997,-0.4704173803329468,0.5910056829452515,-0.6553013920783997,-0.4704173803329468,0.5910056829452515,-0.6553013920783997,-0.4704173803329468,0.7470955848693848,-0.6255302429199219,0.22485576570034027,0.7470955848693848,-0.6255302429199219,0.22485576570034027,0.7470955848693848,-0.6255302429199219,0.22485576570034027,0.7470955848693848,-0.6255302429199219,0.22485576570034027,0.7361034154891968,-0.6567224264144897,0.16391272842884064,0.7361034154891968,-0.6567224264144897,0.16391272842884064,0.7361034154891968,-0.6567224264144897,0.16391272842884064,0.7361034154891968,-0.6567224264144897,0.16391272842884064,0.7361034154891968,-0.6567224264144897,0.16391272842884064,0.7726380228996277,-0.6246670484542847,0.11323241889476776,0.7726380228996277,-0.6246670484542847,0.11323241889476776,0.7726380228996277,-0.6246670484542847,0.11323241889476776,0.7726380228996277,-0.6246670484542847,0.11323241889476776,0.2852247953414917,-0.6296125650405884,0.7226580381393433,0.2852247953414917,-0.6296125650405884,0.7226580381393433,0.2852247953414917,-0.6296125650405884,0.7226580381393433,0.2852247953414917,-0.6296125650405884,0.7226580381393433,0.32667452096939087,-0.6607898473739624,0.6757517457008362,0.32667452096939087,-0.6607898473739624,0.6757517457008362,0.32667452096939087,-0.6607898473739624,0.6757517457008362,0.32667452096939087,-0.6607898473739624,0.6757517457008362,0.32667452096939087,-0.6607898473739624,0.6757517457008362,0.3497964143753052,-0.5950561165809631,0.7235679030418396,0.3497964143753052,-0.5950561165809631,0.7235679030418396,0.3497964143753052,-0.5950561165809631,0.7235679030418396,0.3497964143753052,-0.5950561165809631,0.7235679030418396,-0.7726274132728577,0.6246878504753113,-0.11318989098072052,-0.7726274132728577,0.6246878504753113,-0.11318989098072052,-0.7726274132728577,0.6246878504753113,-0.11318989098072052,-0.7726274132728577,0.6246878504753113,-0.11318989098072052,-0.7692402005195618,-0.6276887655258179,0.11948297917842865,-0.7692402005195618,-0.6276887655258179,0.11948297917842865,-0.7692402005195618,-0.6276887655258179,0.11948297917842865,-0.7692402005195618,-0.6276887655258179,0.11948297917842865,-0.7877770662307739,0.5905534625053406,-0.17508289217948914,-0.7877770662307739,0.5905534625053406,-0.17508289217948914,-0.7877770662307739,0.5905534625053406,-0.17508289217948914,-0.7877770662307739,0.5905534625053406,-0.17508289217948914,-0.7470952868461609,0.6255304217338562,-0.22485589981079102,-0.7470952868461609,0.6255304217338562,-0.22485589981079102,-0.7470952868461609,0.6255304217338562,-0.22485589981079102,-0.7470952868461609,0.6255304217338562,-0.22485589981079102,-0.631263256072998,-0.5948466658592224,-0.4976588785648346,-0.631263256072998,-0.5948466658592224,-0.4976588785648346,-0.631263256072998,-0.5948466658592224,-0.4976588785648346,-0.631263256072998,-0.5948466658592224,-0.4976588785648346,-0.38938289880752563,0.6292169094085693,-0.6726565957069397,-0.38938289880752563,0.6292169094085693,-0.6726565957069397,-0.38938289880752563,0.6292169094085693,-0.6726565957069397,-0.38938289880752563,0.6292169094085693,-0.6726565957069397,-0.5729118585586548,-0.6292456388473511,-0.5251874923706055,-0.5729118585586548,-0.6292456388473511,-0.5251874923706055,-0.5729118585586548,-0.6292456388473511,-0.5251874923706055,-0.5729118585586548,-0.6292456388473511,-0.5251874923706055,0.3904346227645874,0.628699541091919,-0.6725307703018188,0.3904346227645874,0.628699541091919,-0.6725307703018188,0.3904346227645874,0.628699541091919,-0.6725307703018188,0.3904346227645874,0.628699541091919,-0.6725307703018188,0.7437728643417358,0.6275497078895569,-0.2301807701587677,0.7437728643417358,0.6275497078895569,-0.2301807701587677,0.7437728643417358,0.6275497078895569,-0.2301807701587677,0.7437728643417358,0.6275497078895569,-0.2301807701587677,0.6457582712173462,-0.6233645677566528,-0.4409227967262268,0.6457582712173462,-0.6233645677566528,-0.4409227967262268,0.6457582712173462,-0.6233645677566528,-0.4409227967262268,0.6457582712173462,-0.6233645677566528,-0.4409227967262268,0.7877867221832275,-0.5905534029006958,0.17503942549228668,0.7877867221832275,-0.5905534029006958,0.17503942549228668,0.7877867221832275,-0.5905534029006958,0.17503942549228668,0.7877867221832275,-0.5905534029006958,0.17503942549228668,0.6443431377410889,0.6290005445480347,0.43494871258735657,0.6443431377410889,0.6290005445480347,0.43494871258735657,0.6443431377410889,0.6290005445480347,0.43494871258735657,0.6443431377410889,0.6290005445480347,0.43494871258735657,0.5729120969772339,0.6292457580566406,0.5251871347427368,0.5729120969772339,0.6292457580566406,0.5251871347427368,0.5729120969772339,0.6292457580566406,0.5251871347427368,0.5729120969772339,0.6292457580566406,0.5251871347427368,-0.3281112611293793,-0.6602649092674255,0.6755688190460205,-0.3281112611293793,-0.6602649092674255,0.6755688190460205,-0.3281112611293793,-0.6602649092674255,0.6755688190460205,-0.3281112611293793,-0.6602649092674255,0.6755688190460205,-0.3281112611293793,-0.6602649092674255,0.6755688190460205,0.0011704713106155396,-0.6591591238975525,-0.7520025968551636,0.0011704713106155396,-0.6591591238975525,-0.7520025968551636,0.0011704713106155396,-0.6591591238975525,-0.7520025968551636,0.0011704713106155396,-0.6591591238975525,-0.7520025968551636,0.0011704713106155396,-0.6591591238975525,-0.7520025968551636,-0.5910052061080933,0.6553022861480713,0.47041675448417664,-0.5910052061080933,0.6553022861480713,0.47041675448417664,-0.5910052061080933,0.6553022861480713,0.47041675448417664,-0.5910052061080933,0.6553022861480713,0.47041675448417664,-0.5910052061080933,0.6553022861480713,0.47041675448417664,0.0015861615538597107,-0.5931890606880188,-0.8050615787506104,0.0015861615538597107,-0.5931890606880188,-0.8050615787506104,0.0015861615538597107,-0.5931890606880188,-0.8050615787506104,0.0015861615538597107,-0.5931890606880188,-0.8050615787506104,-0.34979522228240967,0.5950555801391602,-0.7235690355300903,-0.34979522228240967,0.5950555801391602,-0.7235690355300903,-0.34979522228240967,0.5950555801391602,-0.7235690355300903,-0.34979522228240967,0.5950555801391602,-0.7235690355300903,0.2873671054840088,0.6291413903236389,-0.7222195863723755,0.2873671054840088,0.6291413903236389,-0.7222195863723755,0.2873671054840088,0.6291413903236389,-0.7222195863723755,0.2873671054840088,0.6291413903236389,-0.7222195863723755,0.6324546933174133,-0.5889533758163452,-0.5031253695487976,0.6324546933174133,-0.5889533758163452,-0.5031253695487976,0.6324546933174133,-0.5889533758163452,-0.5031253695487976,0.6324546933174133,-0.5889533758163452,-0.5031253695487976,0.574481725692749,-0.6237778663635254,-0.5299734473228455,0.574481725692749,-0.6237778663635254,-0.5299734473228455,0.574481725692749,-0.6237778663635254,-0.5299734473228455,0.574481725692749,-0.6237778663635254,-0.5299734473228455,0.35163187980651855,0.594671368598938,-0.7229945659637451,0.35163187980651855,0.594671368598938,-0.7229945659637451,0.35163187980651855,0.594671368598938,-0.7229945659637451,0.35163187980651855,0.594671368598938,-0.7229945659637451,0.7692419290542603,0.6276857852935791,-0.11948888003826141,0.7692419290542603,0.6276857852935791,-0.11948888003826141,0.7692419290542603,0.6276857852935791,-0.11948888003826141,0.7692419290542603,0.6276857852935791,-0.11948888003826141,0.6312867403030396,0.5948468446731567,0.49762865900993347,0.6312867403030396,0.5948468446731567,0.49762865900993347,0.6312867403030396,0.5948468446731567,0.49762865900993347,0.6312867403030396,0.5948468446731567,0.49762865900993347,-0.3904343545436859,-0.6286999583244324,0.6725306510925293,-0.3904343545436859,-0.6286999583244324,0.6725306510925293,-0.3904343545436859,-0.6286999583244324,0.6725306510925293,-0.3904343545436859,-0.6286999583244324,0.6725306510925293,-0.3516600430011749,-0.5946711301803589,0.7229809761047363,-0.3516600430011749,-0.5946711301803589,0.7229809761047363,-0.3516600430011749,-0.5946711301803589,0.7229809761047363,-0.3516600430011749,-0.5946711301803589,0.7229809761047363,-0.5744823813438416,0.6237770915031433,0.5299737453460693,-0.5744823813438416,0.6237770915031433,0.5299737453460693,-0.5744823813438416,0.6237770915031433,0.5299737453460693,-0.5744823813438416,0.6237770915031433,0.5299737453460693,-0.28738611936569214,-0.6291320323944092,0.722220242023468,-0.28738611936569214,-0.6291320323944092,0.722220242023468,-0.28738611936569214,-0.6291320323944092,0.722220242023468,-0.28738611936569214,-0.6291320323944092,0.722220242023468,-0.0015616416931152344,0.5931897759437561,0.8050611615180969,-0.0015616416931152344,0.5931897759437561,0.8050611615180969,-0.0015616416931152344,0.5931897759437561,0.8050611615180969,-0.0015616416931152344,0.5931897759437561,0.8050611615180969,-0.632463812828064,0.5889529585838318,0.5031142830848694,-0.632463812828064,0.5889529585838318,0.5031142830848694,-0.632463812828064,0.5889529585838318,0.5031142830848694,-0.632463812828064,0.5889529585838318,0.5031142830848694,-0.6457580924034119,0.6233644485473633,0.44092315435409546,-0.6457580924034119,0.6233644485473633,0.44092315435409546,-0.6457580924034119,0.6233644485473633,0.44092315435409546,-0.6457580924034119,0.6233644485473633,0.44092315435409546,-0.7842698097229004,-0.593335747718811,0.18131089210510254,-0.7842698097229004,-0.593335747718811,0.18131089210510254,-0.7842698097229004,-0.593335747718811,0.18131089210510254,-0.7842698097229004,-0.593335747718811,0.18131089210510254,-0.7437704205513,-0.6275736689567566,0.23012343049049377,-0.7437704205513,-0.6275736689567566,0.23012343049049377,-0.7437704205513,-0.6275736689567566,0.23012343049049377,-0.7437704205513,-0.6275736689567566,0.23012343049049377,-0.7328628301620483,-0.6589818596839905,0.16927775740623474,-0.7328628301620483,-0.6589818596839905,0.16927775740623474,-0.7328628301620483,-0.6589818596839905,0.16927775740623474,-0.7328628301620483,-0.6589818596839905,0.16927775740623474,-0.7328628301620483,-0.6589818596839905,0.16927775740623474,-0.5893685817718506,-0.6605226993560791,-0.4651390612125397,-0.5893685817718506,-0.6605226993560791,-0.4651390612125397,-0.5893685817718506,-0.6605226993560791,-0.4651390612125397,-0.5893685817718506,-0.6605226993560791,-0.4651390612125397,-0.5893685817718506,-0.6605226993560791,-0.4651390612125397,0.38937872648239136,-0.6292127966880798,0.6726629734039307,0.38937872648239136,-0.6292127966880798,0.6726629734039307,0.38937872648239136,-0.6292127966880798,0.6726629734039307,0.38937872648239136,-0.6292127966880798,0.6726629734039307,-0.0011698007583618164,0.6591596007347107,0.7520022988319397,-0.0011698007583618164,0.6591596007347107,0.7520022988319397,-0.0011698007583618164,0.6591596007347107,0.7520022988319397,-0.0011698007583618164,0.6591596007347107,0.7520022988319397,-0.0011698007583618164,0.6591596007347107,0.7520022988319397,0.7328664064407349,0.6589823961257935,-0.16926002502441406,0.7328664064407349,0.6589823961257935,-0.16926002502441406,0.7328664064407349,0.6589823961257935,-0.16926002502441406,0.7328664064407349,0.6589823961257935,-0.16926002502441406,0.7328664064407349,0.6589823961257935,-0.16926002502441406,-0.3266833424568176,0.6607902646064758,-0.6757471561431885,-0.3266833424568176,0.6607902646064758,-0.6757471561431885,-0.3266833424568176,0.6607902646064758,-0.6757471561431885,-0.3266833424568176,0.6607902646064758,-0.6757471561431885,-0.3266833424568176,0.6607902646064758,-0.6757471561431885,-0.7360942959785461,0.6567226648330688,-0.16395282745361328,-0.7360942959785461,0.6567226648330688,-0.16395282745361328,-0.7360942959785461,0.6567226648330688,-0.16395282745361328,-0.7360942959785461,0.6567226648330688,-0.16395282745361328,-0.7360942959785461,0.6567226648330688,-0.16395282745361328,0.0001270859647775069,1,0.00006240241782506928,0.0001270859647775069,1,0.00006240241782506928,0.0001270859647775069,1,0.00006240241782506928,0.0001270859647775069,1,0.00006240241782506928,0.0001270859647775069,1,0.00006240241782506928,0.0001270859647775069,1,0.00006240241782506928,0.0001270859647775069,1,0.00006240241782506928,-0.00012663456436712295,-1,-0.00006260263762669638,-0.00012663456436712295,-1,-0.00006260263762669638,-0.00012663456436712295,-1,-0.00006260263762669638,-0.00012663456436712295,-1,-0.00006260263762669638,-0.00012663456436712295,-1,-0.00006260263762669638,-0.00012663456436712295,-1,-0.00006260263762669638,-0.00012663456436712295,-1,-0.00006260263762669638],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.012080706655979156,0.01143413782119751,0.02038293331861496,0.2402452826499939,0.07275813817977905,0.7014026641845703,0.23399420082569122,0.044198572635650635,0.012080706655979156,0.09173142910003662,0.09271499514579773,0.0920637845993042,0.22834762930870056,0.033225297927856445,0.24569767713546753,0.027156472206115723,0.8750260472297668,0.27947235107421875,0.15672194957733154,0.03217524290084839,0.15672194957733154,0.040720343589782715,0.21759822964668274,0.041023433208465576,0.624879777431488,0.4702685475349426,0.04823240637779236,0.03318381309509277,0.07462695240974426,0.2401202917098999,0.1386493444442749,0.24023151397705078,0.20049551129341125,0.03662097454071045,0.3756515383720398,0.27943485975265503,0.04823240637779236,0.08685857057571411,0.07282328605651855,0.45090705156326294,0.16252003610134125,0.018233835697174072,0.2011767327785492,0.2402452826499939,0.1273123025894165,0.01617354154586792,0.14694836735725403,0.09188961982727051,0.17717677354812622,0.4513193964958191,0.25039011240005493,0.08733206987380981,0.04823240637779236,0.09189057350158691,0.05499856173992157,0.009189963340759277,0.0725666880607605,0.9514256715774536,0.14694836735725403,0.043423593044281006,0.07372921705245972,0.016311585903167725,0.07462692260742188,0.08685952425003052,0.21925535798072815,0.09241074323654175,0.4275488257408142,0.9517285227775574,0.12057686597108841,0.09188848733901978,0.14611805975437164,0.009021878242492676,0.22737187147140503,0.08733206987380981,0.32245123386383057,0.9515766501426697,0.11080294847488403,0.026038765907287598,0.12057653814554214,0.029400944709777832,0.21095037460327148,0.2402452826499939,0.24711300432682037,0.0928187370300293,0.6267523169517517,0.7800135612487793,0.09018958359956741,0.008709728717803955,0.12057658284902573,0.04346507787704468,0.1830982267856598,0.09213989973068237,0.9277936816215515,0.951744794845581,0.10317572951316833,0.0293390154838562,0.1393822878599167,0.032990872859954834,0.1830982267856598,0.2402452826499939,0.255423367023468,0.09287703037261963,0.8746025562286377,0.7797321677207947,0.16253256797790527,0.03631782531738281,0.16336379945278168,0.04333001375198364,0.2554234266281128,0.2402452826499939,0.8222063779830933,0.9510524272918701,0.03845880925655365,0.09173208475112915,0.10992515832185745,0.01626521348953247,0.24376779794692993,0.04419851303100586,0.42733103036880493,0.701709508895874,0.03845880925655365,0.026774346828460693,0.03845880925655365,0.24016445875167847,0.14694836735725403,0.036410391330718994,0.174796923995018,0.24008393287658691,0.37455111742019653,0.5295032858848572,0.03845880925655365,0.08928269147872925,0.1273123025894165,0.009048819541931152,0.24376779794692993,0.08995997905731201,0.37507760524749756,0.7204967141151428,0.17645640671253204,0.043330609798431396,0.21771717071533203,0.016403138637542725,0.22902902960777283,0.2402452826499939,0.6778356432914734,0.20166105031967163,0.04823240637779236,0.014015018939971924,0.056542813777923584,0.09192115068435669,0.1830982267856598,0.08697599172592163,0.9278727769851685,0.7018176913261414,0.05499856173992157,0.0163193941116333,0.1403140127658844,0.040812790393829346,0.17645637691020966,0.08961743116378784,0.6247076988220215,0.22033452987670898,0.140313982963562,0.08676266670227051,0.15672211349010468,0.09213924407958984,0.18057595193386078,0.017045259475708008,0.5721643567085266,0.201244056224823,0.012080706655979156,0.08928197622299194,0.12499088048934937,0.9704728722572327,0.14694836735725403,0.08941596746444702,0.17478692531585693,0.012857019901275635,0.018697038292884827,0.08670186996459961,0.16502328217029572,0.09206610918045044,0.17724192142486572,0.7014986276626587,0.18057595193386078,0.008743643760681152,0.012080706655979156,0.04335254430770874,0.12887565791606903,0.09186422824859619,0.1393822878599167,0.013869822025299072,0.1774333119392395,0.9517008662223816,0.09104300290346146,0.04336506128311157,0.09271499514579773,0.2402452826499939,0.19964106380939484,0.009263157844543457,0.8223589658737183,0.45139479637145996,0.08440056443214417,0.24022287130355835,0.1928718537092209,0.014091014862060547,0.21759822964668274,0.08731919527053833,0.6777778267860413,0.45166242122650146,0.16253256797790527,0.02800750732421875,0.21095037460327148,0.04365772008895874,0.24711309373378754,0.24022060632705688,0.6778541803359985,0.951484739780426,0.12057655304670334,0.08941489458084106,0.16336379945278168,0.08961677551269531,0.2351137399673462,0.009227573871612549,0.8750938177108765,0.9702678322792053,0.07462695240974426,0.0918915867805481,0.12721094489097595,0.0868040919303894,0.2351137399673462,0.0163571834564209,0.4274844527244568,0.45174920558929443,0.031842514872550964,0.08667910099029541,0.12057653814554214,0.011325597763061523,0.13864925503730774,0.09186530113220215,0.3225155472755432,0.45152556896209717,0.012080706655979156,0.03307300806045532,0.030156202614307404,0.026774346828460693,0.030156515538692474,0.2402452826499939,0.10248857736587524,0.092063307762146,0.6261616945266724,0.5296865701675415,0.12057653814554214,0.2402452826499939,0.1281311959028244,0.025947153568267822,0.21095037460327148,0.029455959796905518,0.21925535798072815,0.2400715947151184,0.3766971230506897,0.7794159054756165,0.07462692260742188,0.02608513832092285,0.1928718537092209,0.09240931272506714,0.23733942210674286,0.0928187370300293,0.24569767713546753,0.007925331592559814,0.875484049320221,0.02962595224380493,0.01882428675889969,0.009150922298431396,0.07462692260742188,0.04079252481460571,0.22737182676792145,0.04158461093902588,0.37476611137390137,0.9705840945243835,0.018697038292884827,0.0407489538192749,0.12485933303833008,0.7203324437141418,0.14611805975437164,0.016146481037139893,0.23399420082569122,0.08995997905731201,0.012080781161785126,0.24023497104644775,0.01882428675889969,0.01627671718597412,0.06800204515457153,0.04341691732406616,0.9276410341262817,0.4518194794654846,0.08440056443214417,0.04074656963348389,0.19964106380939484,0.01640307903289795,0.21095037460327148,0.08995997905731201,0.6247829794883728,0.9699863791465759,0.06695697456598282,0.011504054069519043,0.08440056443214417,0.08688396215438843,0.21095052361488342,0.09248226881027222,0.5721458196640015,0.9508618116378784,0.06800201535224915,0.0894421935081482,0.07372921705245972,0.009201109409332275,0.09104300290346146,0.08953815698623657,0.8750190138816833,0.47052764892578125,0.06631660461425781,0.09192222356796265,0.15672194957733154,0.08697539567947388,0.22834759950637817,0.011532008647918701,0.5722221732139587,0.4511365294456482,0.03184248507022858,0.04074972867965698,0.08440056443214417,0.012897908687591553,0.12721094489097595,0.04081183671951294,0.374919056892395,0.47056519985198975,0.030156202614307404,0.014692902565002441,0.10248860716819763,0.2402452826499939,0.10416048020124435,0.043364644050598145,0.6775245070457458,0.7015867233276367,0.054857321083545685,0.08944112062454224,0.10416045039892197,0.08953768014907837,0.15672194957733154,0.014117896556854248,0.6248504519462585,0.7203134894371033,0.11080294847488403,0.086883544921875,0.16252003610134125,0.009928703308105469,0.19287201762199402,0.24017375707626343,0.9280667304992676,0.20186400413513184,0.030156604945659637,0.09174239635467529,0.054857321083545685,0.043415963649749756,0.10317572951316833,0.011430740356445312,0.5724754929542542,0.7012842297554016,0.04823240637779236,0.04079157114028931,0.10992515832185745,0.009145617485046387,0.12513083219528198,0.4699118137359619,0.25039011240005493,0.04158461093902588,0.03691284358501434,0.017000675201416016,0.11080294847488403,0.04074627161026001,0.1928718537092209,0.041023433208465576,0.8749712705612183,0.22037410736083984,0.1928718537092209,0.0873255729675293,0.21095037460327148,0.011578857898712158,0.23733942210674286,0.2402205467224121,0.8219332098960876,0.20110386610031128,0.1830982267856598,0.040720999240875244,0.19951972365379333,0.08995997905731201,0.21771717071533203,0.009267032146453857,0.8749260902404785,0.7204409241676331,0.03691284358501434,0.009847462177276611,0.11080294847488403,0.24022287130355835,0.19951972365379333,0.04366427659988403,0.8221272826194763,0.7012577056884766,0.01972394436597824,0.03634655475616455,0.056542813777923584,0.2402452826499939,0.11080294847488403,0.09198707342147827,0.18309825658798218,0.026818931102752686,0.8757262825965881,0.5295590758323669,0.04823248088359833,0.2401202917098999,0.1251671314239502,0.7795271873474121,0.12887565791606903,0.24023151397705078,0.17478697001934052,0.026818931102752686,0.21857404708862305,0.026176750659942627,0.03845880925655365,0.04332977533340454,0.09018958359956741,0.01701122522354126,0.1747969537973404,0.09206688404083252,0.32266902923583984,0.7014552354812622,0.06695697456598282,0.02927464246749878,0.1242377758026123,0.2800881862640381,0.14694832265377045,0.2402452826499939,0.1928718090057373,0.03334176540374756,0.2011767327785492,0.09258311986923218,0.05590075999498367,0.036389052867889404,0.06631642580032349,0.2402452826499939,0.08440063893795013,0.09198743104934692,0.25401246547698975,0.027156472206115723,0.6260393857955933,0.2797313928604126,0.02038293331861496,0.09181225299835205,0.09270339459180832,0.026784837245941162,0.12602335214614868,0.5296675562858582,0.16502328217029572,0.24008393287658691,0.2359241247177124,0.03662097454071045,0.08440056443214417,0.026784837245941162,0.15672194957733154,0.2402452826499939,0.22902897000312805,0.09287703037261963,0.25400829315185547,0.007925331592559814,0.6272023916244507,0.02966541051864624,0.05590075999498367,0.026093125343322754,0.07462692260742188,0.03639000654220581,0.08838308602571487,0.03634411096572876,0.20049551129341125,0.026176750659942627,0.2359241247177124,0.026130735874176025,0.24978983402252197,0.01738286018371582,0.2499590814113617,0.03662097454071045,0.01972394436597824,0.0260503888130188,0.034168489277362823,0.036347150802612305,0.11080294847488403,0.03634369373321533,0.1281311959028244,0.03640943765640259,0.14694836735725403,0.02592015266418457,0.1791275292634964,0.03631848096847534,0.21857404708862305,0.03662097454071045],\n \"normalized\": false\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [96,28,86,33,37,139,108,155,151,195,179,135,120,116,17,171,183,175,84,72,237,2,91,230,100,147,8,163,104,227,46,55,112,170,176,189,19,24,219,101,5,225,106,103,11,83,92,88,45,63,49,192,202,190,209,74,26,182,57,185,165,215,43,93,89,140,194,235,71,3,36,143,168,188,200,142,35,95,75,69,79,228,144,1,31,146,156,107,50,41,44,114,166,136,0,145,97,153,158,162,115,111,124,201,206,14,160,224,82,231,90,30,157,152,70,198,193,102,149,99,214,117,65,34,211,94,53,161,110,9,52,105,73,77,27,58,25,187,66,118,22,154,129,32,81,29,78,222,178,21,15,23,119,18,181,184,76,203,199,180,61,56,59,217,68,20,177,174,6,232,242,229,233,240,236,134,243,131,218,239,221,16,241,13,223,238,226,7,244,60,122,246,121,204,245,207,212,250,213,128,251,127,39,248,38,47,247,48,62,249,96,210,28,33,130,37,108,42,155,195,191,179,120,167,116,171,125,183,84,80,72,2,141,91,100,159,147,163,12,104,46,51,55,170,173,176,19,186,24,101,98,5,106,150,103,45,216,63,192,197,202,209,205,74,93,85,89,194,133,235,3,138,36,75,196,69,228,4,144,31,137,146,107,54,50,44,109,114,97,148,153,124,169,201,14,113,160,82,234,231,214,164,117,34,126,211,53,10,161,58,67,25,154,40,129,81,87,29,222,132,178,15,220,23,18,172,181,76,208,203,180,123,61,59,64,217]\n },\n \"boundingSphere\": {\n \"center\": [0,-0.00000762939453125,0],\n \"radius\": 139.86793680588863\n }\n },\n faceValues: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],\n rotationCombinations: {\n \"1,2\": [1, -51, 0],\n \"1,3\": [-1, -103, -1],\n \"1,4\": [0, -155, 0],\n \"1,5\": [0, 154, 0],\n \"1,6\": [2, 103, -2],\n \"1,7\": [0, 52, 1],\n \"1,8\": [2, -77, -178],\n \"1,9\": [180, -51, -1],\n \"1,10\": [-180, 0, 0],\n \"1,11\": [-179, 51, -1],\n \"1,12\": [-1, 77, -179],\n \"1,13\": [0, 26, 180],\n \"1,14\": [1, -26, -180],\n \"2,3\": [0, -52, 0],\n \"2,4\": [-2, -103, -2],\n \"2,5\": [0, -154, 0],\n \"2,6\": [0, 154, 0],\n \"2,7\": [2, 103, -2],\n \"2,8\": [0, -26, -180],\n \"2,9\": [2, -77, -178],\n \"2,10\": [180, -52, -1],\n \"2,11\": [-180, 0, 0],\n \"2,12\": [-180, 51, -1],\n \"2,13\": [-1, 77, -179],\n \"2,14\": [0, 26, 180],\n \"3,4\": [1, -52, 1],\n \"3,5\": [-2, -103, -2],\n \"3,6\": [0, -154, 0],\n \"3,7\": [0, 155, -1],\n \"3,8\": [0, 26, -180],\n \"3,9\": [0, -26, -179],\n \"3,10\": [1, -77, -179],\n \"3,11\": [180, -52, 0],\n \"3,12\": [180, 0, -1],\n \"3,13\": [-180, 51, -1],\n \"3,14\": [0, 77, 180],\n \"4,5\": [0, -51, 0],\n \"4,6\": [0, -103, 1],\n \"4,7\": [0, -154, 0],\n \"4,8\": [1, 77, 179],\n \"4,9\": [0, 26, -180],\n \"4,10\": [0, -25, -180],\n \"4,11\": [-1, -77, 180],\n \"4,12\": [180, -52, 0],\n \"4,13\": [180, 0, 0],\n \"4,14\": [179, 51, 0],\n \"5,6\": [0, -51, 0],\n \"5,7\": [1, -103, 1],\n \"5,8\": [180, 51, 0],\n \"5,9\": [1, 77, 179],\n \"5,10\": [0, 26, -180],\n \"5,11\": [0, -25, 180],\n \"5,12\": [0, -77, 180],\n \"5,13\": [180, -52, 0],\n \"5,14\": [180, 0, 0],\n \"6,7\": [0, -51, -1],\n \"6,8\": [180, 0, 0],\n \"6,9\": [180, 52, 1],\n \"6,10\": [1, 77, 180],\n \"6,11\": [0, 26, 180],\n \"6,12\": [0, -26, 180],\n \"6,13\": [0, -77, 179],\n \"6,14\": [180, -51, 0],\n \"7,8\": [180, -51, -1],\n \"7,9\": [-180, 0, 0],\n \"7,10\": [-180, 51, 0],\n \"7,11\": [-1, 77, -179],\n \"7,12\": [0, 26, 180],\n \"7,13\": [0, -26, 180],\n \"7,14\": [2, -77, -178],\n \"8,9\": [0, 51, 1],\n \"8,10\": [1, 103, 0],\n \"8,11\": [0, 154, 0],\n \"8,12\": [0, -155, 0],\n \"8,13\": [0, -103, -1],\n \"8,14\": [0, -52, 0],\n \"9,10\": [0, 51, 0],\n \"9,11\": [-1, 103, 1],\n \"9,12\": [0, 154, 0],\n \"9,13\": [0, -154, 0],\n \"9,14\": [2, -103, 2],\n \"10,11\": [0, 51, 0],\n \"10,12\": [0, 103, 0],\n \"10,13\": [0, 154, 0],\n \"10,14\": [0, -154, 0],\n \"11,12\": [0, 52, 0],\n \"11,13\": [0, 103, -1],\n \"11,14\": [0, 155, 0],\n \"12,13\": [0, 52, 0],\n \"12,14\": [3, 103, -3],\n \"13,14\": [-1, 51, 1]\n }\n },\n \"d16\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"C14C9443-AE98-4545-B8F9-EEF68D99E5CB\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [1.9203956127166748,-75.6114730834961,4.636213302612305,1.9203956127166748,-75.6114730834961,4.636213302612305,1.9203956127166748,-75.6114730834961,4.636213302612305,1.9203956127166748,-75.6114730834961,4.636213302612305,1.9203956127166748,-75.6114730834961,4.636213302612305,1.9203956127166748,-75.6114730834961,4.636213302612305,-1.9200903177261353,1.4698024988174438,78.77789306640625,-1.9200903177261353,1.4698024988174438,78.77789306640625,-1.9200903177261353,1.4698024988174438,78.77789306640625,-1.9200903177261353,1.4698024988174438,78.77789306640625,-1.9200903177261353,1.4698024988174438,78.77789306640625,57.06234359741211,-1.4698084592819214,54.34610366821289,57.06234359741211,-1.4698084592819214,54.34610366821289,57.06234359741211,-1.4698084592819214,54.34610366821289,57.06234359741211,-1.4698084592819214,54.34610366821289,57.06234359741211,-1.4698084592819214,54.34610366821289,-1.9204055070877075,-75.6114730834961,-4.63621187210083,-1.9204055070877075,-75.6114730834961,-4.63621187210083,-1.9204055070877075,-75.6114730834961,-4.63621187210083,-1.9204055070877075,-75.6114730834961,-4.63621187210083,-1.9204055070877075,-75.6114730834961,-4.63621187210083,54.34610366821289,1.4697924852371216,-57.06234359741211,54.34610366821289,1.4697924852371216,-57.06234359741211,54.34610366821289,1.4697924852371216,-57.06234359741211,54.34610366821289,1.4697924852371216,-57.06234359741211,54.34610366821289,1.4697924852371216,-57.06234359741211,1.9206753969192505,1.4697996377944946,78.77787780761719,1.9206753969192505,1.4697996377944946,78.77787780761719,1.9206753969192505,1.4697996377944946,78.77787780761719,1.9206753969192505,1.4697996377944946,78.77787780761719,1.9206753969192505,1.4697996377944946,78.77787780761719,1.9206753969192505,1.4697996377944946,78.77787780761719,-4.6361985206604,75.6114730834961,1.9204007387161255,-4.6361985206604,75.6114730834961,1.9204007387161255,-4.6361985206604,75.6114730834961,1.9204007387161255,-4.6361985206604,75.6114730834961,1.9204007387161255,-4.6361985206604,75.6114730834961,1.9204007387161255,-57.06234359741211,1.469807744026184,-54.34610366821289,-57.06234359741211,1.469807744026184,-54.34610366821289,-57.06234359741211,1.469807744026184,-54.34610366821289,-57.06234359741211,1.469807744026184,-54.34610366821289,-57.06234359741211,1.469807744026184,-54.34610366821289,-57.06234359741211,1.469807744026184,-54.34610366821289,-57.06234359741211,1.469807744026184,-54.34610366821289,78.77787780761719,-1.4698125123977661,-1.9206798076629639,78.77787780761719,-1.4698125123977661,-1.9206798076629639,78.77787780761719,-1.4698125123977661,-1.9206798076629639,78.77787780761719,-1.4698125123977661,-1.9206798076629639,78.77787780761719,-1.4698125123977661,-1.9206798076629639,78.77787780761719,-1.4698125123977661,-1.9206798076629639,4.6362080574035645,-75.6114730834961,-1.9204015731811523,4.6362080574035645,-75.6114730834961,-1.9204015731811523,4.6362080574035645,-75.6114730834961,-1.9204015731811523,4.6362080574035645,-75.6114730834961,-1.9204015731811523,4.6362080574035645,-75.6114730834961,-1.9204015731811523,4.6362080574035645,-75.6114730834961,-1.9204015731811523,57.06194305419922,-1.4698078632354736,-54.346519470214844,57.06194305419922,-1.4698078632354736,-54.346519470214844,57.06194305419922,-1.4698078632354736,-54.346519470214844,57.06194305419922,-1.4698078632354736,-54.346519470214844,1.9201017618179321,-1.4698004722595215,-78.77789306640625,1.9201017618179321,-1.4698004722595215,-78.77789306640625,1.9201017618179321,-1.4698004722595215,-78.77789306640625,1.9201017618179321,-1.4698004722595215,-78.77789306640625,1.9201017618179321,-1.4698004722595215,-78.77789306640625,54.34610366821289,-1.4698083400726318,-57.06234359741211,54.34610366821289,-1.4698083400726318,-57.06234359741211,54.34610366821289,-1.4698083400726318,-57.06234359741211,54.34610366821289,-1.4698083400726318,-57.06234359741211,54.34610366821289,-1.4698083400726318,-57.06234359741211,54.34610366821289,-1.4698083400726318,-57.06234359741211,57.06194305419922,1.469793438911438,-54.346519470214844,57.06194305419922,1.469793438911438,-54.346519470214844,57.06194305419922,1.469793438911438,-54.346519470214844,57.06194305419922,1.469793438911438,-54.346519470214844,57.06194305419922,1.469793438911438,-54.346519470214844,78.77787780761719,1.4697893857955933,-1.920678734779358,78.77787780761719,1.4697893857955933,-1.920678734779358,78.77787780761719,1.4697893857955933,-1.920678734779358,78.77787780761719,1.4697893857955933,-1.920678734779358,78.77787780761719,1.4697893857955933,-1.920678734779358,-54.34610366821289,1.469807505607605,57.06234359741211,-54.34610366821289,1.469807505607605,57.06234359741211,-54.34610366821289,1.469807505607605,57.06234359741211,-54.34610366821289,1.469807505607605,57.06234359741211,-57.06194305419922,-1.469792366027832,54.346519470214844,-57.06194305419922,-1.469792366027832,54.346519470214844,-57.06194305419922,-1.469792366027832,54.346519470214844,-57.06194305419922,-1.469792366027832,54.346519470214844,-78.77787780761719,1.4698104858398438,1.920676589012146,-78.77787780761719,1.4698104858398438,1.920676589012146,-78.77787780761719,1.4698104858398438,1.920676589012146,-78.77787780761719,1.4698104858398438,1.920676589012146,-78.77787780761719,1.4698104858398438,1.920676589012146,-78.77787780761719,1.4698104858398438,1.920676589012146,-57.06234359741211,-1.469793438911438,-54.34610366821289,-57.06234359741211,-1.469793438911438,-54.34610366821289,-57.06234359741211,-1.469793438911438,-54.34610366821289,-57.06234359741211,-1.469793438911438,-54.34610366821289,4.6362409591674805,75.6114730834961,1.920365810394287,4.6362409591674805,75.6114730834961,1.920365810394287,4.6362409591674805,75.6114730834961,1.920365810394287,4.6362409591674805,75.6114730834961,1.920365810394287,4.6362409591674805,75.6114730834961,1.920365810394287,-1.9203522205352783,75.6114730834961,4.636227607727051,-1.9203522205352783,75.6114730834961,4.636227607727051,-1.9203522205352783,75.6114730834961,4.636227607727051,-1.9203522205352783,75.6114730834961,4.636227607727051,-1.9203522205352783,75.6114730834961,4.636227607727051,-1.9203522205352783,75.6114730834961,4.636227607727051,-1.9203522205352783,75.6114730834961,4.636227607727051,1.9204154014587402,75.61146545410156,4.636213302612305,1.9204154014587402,75.61146545410156,4.636213302612305,1.9204154014587402,75.61146545410156,4.636213302612305,1.9204154014587402,75.61146545410156,4.636213302612305,1.9204154014587402,75.61146545410156,4.636213302612305,1.9204154014587402,75.61146545410156,4.636213302612305,-1.9203720092773438,-75.6114730834961,4.636226177215576,-1.9203720092773438,-75.6114730834961,4.636226177215576,-1.9203720092773438,-75.6114730834961,4.636226177215576,-1.9203720092773438,-75.6114730834961,4.636226177215576,-1.9203720092773438,-75.6114730834961,4.636226177215576,-4.636218547821045,-75.61146545410156,1.920400619506836,-4.636218547821045,-75.61146545410156,1.920400619506836,-4.636218547821045,-75.61146545410156,1.920400619506836,-4.636218547821045,-75.61146545410156,1.920400619506836,-4.636218547821045,-75.61146545410156,1.920400619506836,-4.636218547821045,-75.61146545410156,1.920400619506836,-4.636231899261475,-75.61146545410156,-1.9203662872314453,-4.636231899261475,-75.61146545410156,-1.9203662872314453,-4.636231899261475,-75.61146545410156,-1.9203662872314453,-4.636231899261475,-75.61146545410156,-1.9203662872314453,-4.636231899261475,-75.61146545410156,-1.9203662872314453,-4.636231899261475,-75.61146545410156,-1.9203662872314453,-4.636231899261475,-75.61146545410156,-1.9203662872314453,-54.34610366821289,-1.4697926044464111,57.06234359741211,-54.34610366821289,-1.4697926044464111,57.06234359741211,-54.34610366821289,-1.4697926044464111,57.06234359741211,-54.34610366821289,-1.4697926044464111,57.06234359741211,-54.34610366821289,-1.4697926044464111,57.06234359741211,-54.34610366821289,-1.4697926044464111,57.06234359741211,-57.06194305419922,1.4698082208633423,54.346519470214844,-57.06194305419922,1.4698082208633423,54.346519470214844,-57.06194305419922,1.4698082208633423,54.346519470214844,-57.06194305419922,1.4698082208633423,54.346519470214844,-57.06194305419922,1.4698082208633423,54.346519470214844,-57.06194305419922,1.4698082208633423,54.346519470214844,-1.9206644296646118,-1.469801664352417,-78.77787780761719,-1.9206644296646118,-1.469801664352417,-78.77787780761719,-1.9206644296646118,-1.469801664352417,-78.77787780761719,-1.9206644296646118,-1.469801664352417,-78.77787780761719,-1.9206644296646118,-1.469801664352417,-78.77787780761719,-1.9206644296646118,-1.469801664352417,-78.77787780761719,78.77789306640625,1.469791293144226,1.9200873374938965,78.77789306640625,1.469791293144226,1.9200873374938965,78.77789306640625,1.469791293144226,1.9200873374938965,78.77789306640625,1.469791293144226,1.9200873374938965,78.77789306640625,1.469791293144226,1.9200873374938965,78.77789306640625,1.469791293144226,1.9200873374938965,57.06234359741211,1.4697922468185425,54.34610366821289,57.06234359741211,1.4697922468185425,54.34610366821289,57.06234359741211,1.4697922468185425,54.34610366821289,57.06234359741211,1.4697922468185425,54.34610366821289,57.06234359741211,1.4697922468185425,54.34610366821289,78.77789306640625,-1.4698106050491333,1.9200865030288696,78.77789306640625,-1.4698106050491333,1.9200865030288696,78.77789306640625,-1.4698106050491333,1.9200865030288696,78.77789306640625,-1.4698106050491333,1.9200865030288696,78.77789306640625,-1.4698106050491333,1.9200865030288696,54.346519470214844,-1.4698073863983154,57.06194305419922,54.346519470214844,-1.4698073863983154,57.06194305419922,54.346519470214844,-1.4698073863983154,57.06194305419922,54.346519470214844,-1.4698073863983154,57.06194305419922,54.346519470214844,-1.4698073863983154,57.06194305419922,54.346519470214844,1.4697927236557007,57.06194305419922,54.346519470214844,1.4697927236557007,57.06194305419922,54.346519470214844,1.4697927236557007,57.06194305419922,54.346519470214844,1.4697927236557007,57.06194305419922,54.346519470214844,1.4697927236557007,57.06194305419922,-78.77789306640625,1.469812273979187,-1.920089602470398,-78.77789306640625,1.469812273979187,-1.920089602470398,-78.77789306640625,1.469812273979187,-1.920089602470398,-78.77789306640625,1.469812273979187,-1.920089602470398,-4.636211395263672,75.6114730834961,-1.920365810394287,-4.636211395263672,75.6114730834961,-1.920365810394287,-4.636211395263672,75.6114730834961,-1.920365810394287,-4.636211395263672,75.6114730834961,-1.920365810394287,-4.636211395263672,75.6114730834961,-1.920365810394287,-4.636211395263672,75.6114730834961,-1.920365810394287,-54.346519470214844,1.4698083400726318,-57.06194305419922,-54.346519470214844,1.4698083400726318,-57.06194305419922,-54.346519470214844,1.4698083400726318,-57.06194305419922,-54.346519470214844,1.4698083400726318,-57.06194305419922,-54.346519470214844,1.4698083400726318,-57.06194305419922,-1.9206633567810059,1.4698004722595215,-78.77787780761719,-1.9206633567810059,1.4698004722595215,-78.77787780761719,-1.9206633567810059,1.4698004722595215,-78.77787780761719,-1.9206633567810059,1.4698004722595215,-78.77787780761719,-1.9206633567810059,1.4698004722595215,-78.77787780761719,-1.9206633567810059,1.4698004722595215,-78.77787780761719,-1.920385479927063,75.6114730834961,-4.636212348937988,-1.920385479927063,75.6114730834961,-4.636212348937988,-1.920385479927063,75.6114730834961,-4.636212348937988,-1.920385479927063,75.6114730834961,-4.636212348937988,-1.920385479927063,75.6114730834961,-4.636212348937988,-1.920385479927063,75.6114730834961,-4.636212348937988,1.9201031923294067,1.469801664352417,-78.77789306640625,1.9201031923294067,1.469801664352417,-78.77789306640625,1.9201031923294067,1.469801664352417,-78.77789306640625,1.9201031923294067,1.469801664352417,-78.77789306640625,1.9201031923294067,1.469801664352417,-78.77789306640625,1.9203814268112183,75.61146545410156,-4.636227130889893,1.9203814268112183,75.61146545410156,-4.636227130889893,1.9203814268112183,75.61146545410156,-4.636227130889893,1.9203814268112183,75.61146545410156,-4.636227130889893,1.9203814268112183,75.61146545410156,-4.636227130889893,1.9203814268112183,75.61146545410156,-4.636227130889893,4.636227607727051,75.61146545410156,-1.9204010963439941,4.636227607727051,75.61146545410156,-1.9204010963439941,4.636227607727051,75.61146545410156,-1.9204010963439941,4.636227607727051,75.61146545410156,-1.9204010963439941,4.636227607727051,75.61146545410156,-1.9204010963439941,4.636227607727051,75.61146545410156,-1.9204010963439941,4.636227607727051,75.61146545410156,-1.9204010963439941,1.9203611612319946,-75.6114730834961,-4.636227130889893,1.9203611612319946,-75.6114730834961,-4.636227130889893,1.9203611612319946,-75.6114730834961,-4.636227130889893,1.9203611612319946,-75.6114730834961,-4.636227130889893,1.9203611612319946,-75.6114730834961,-4.636227130889893,1.9203611612319946,-75.6114730834961,-4.636227130889893,4.636220455169678,-75.6114730834961,1.9203660488128662,4.636220455169678,-75.6114730834961,1.9203660488128662,4.636220455169678,-75.6114730834961,1.9203660488128662,4.636220455169678,-75.6114730834961,1.9203660488128662,4.636220455169678,-75.6114730834961,1.9203660488128662,4.636220455169678,-75.6114730834961,1.9203660488128662,4.636220455169678,-75.6114730834961,1.9203660488128662,-1.9200901985168457,-1.4697996377944946,78.77789306640625,-1.9200901985168457,-1.4697996377944946,78.77789306640625,-1.9200901985168457,-1.4697996377944946,78.77789306640625,-1.9200901985168457,-1.4697996377944946,78.77789306640625,-1.9200901985168457,-1.4697996377944946,78.77789306640625,-1.9200901985168457,-1.4697996377944946,78.77789306640625,1.9206759929656982,-1.4698023796081543,78.77787780761719,1.9206759929656982,-1.4698023796081543,78.77787780761719,1.9206759929656982,-1.4698023796081543,78.77787780761719,1.9206759929656982,-1.4698023796081543,78.77787780761719,1.9206759929656982,-1.4698023796081543,78.77787780761719,-78.77789306640625,-1.4697893857955933,-1.9200888872146606,-78.77789306640625,-1.4697893857955933,-1.9200888872146606,-78.77789306640625,-1.4697893857955933,-1.9200888872146606,-78.77789306640625,-1.4697893857955933,-1.9200888872146606,-78.77789306640625,-1.4697893857955933,-1.9200888872146606,-78.77789306640625,-1.4697893857955933,-1.9200888872146606,-78.77787780761719,-1.4697915315628052,1.9206773042678833,-78.77787780761719,-1.4697915315628052,1.9206773042678833,-78.77787780761719,-1.4697915315628052,1.9206773042678833,-78.77787780761719,-1.4697915315628052,1.9206773042678833,-78.77787780761719,-1.4697915315628052,1.9206773042678833,-78.77787780761719,-1.4697915315628052,1.9206773042678833,-54.346519470214844,-1.4697924852371216,-57.06194305419922,-54.346519470214844,-1.4697924852371216,-57.06194305419922,-54.346519470214844,-1.4697924852371216,-57.06194305419922,-54.346519470214844,-1.4697924852371216,-57.06194305419922,-54.346519470214844,-1.4697924852371216,-57.06194305419922,-54.346519470214844,-1.4697924852371216,-57.06194305419922,0.00001482796960772248,77.15787506103516,4.608693302543543e-7,0.00001482796960772248,77.15787506103516,4.608693302543543e-7,0.00001482796960772248,77.15787506103516,4.608693302543543e-7,0.00001482796960772248,77.15787506103516,4.608693302543543e-7,0.00001482796960772248,77.15787506103516,4.608693302543543e-7,0.00001482796960772248,77.15787506103516,4.608693302543543e-7,0.00001482796960772248,77.15787506103516,4.608693302543543e-7,0.00001482796960772248,77.15787506103516,4.608693302543543e-7,-0.000005149714979779674,-77.15787506103516,8.015119590254471e-8,-0.000005149714979779674,-77.15787506103516,8.015119590254471e-8,-0.000005149714979779674,-77.15787506103516,8.015119590254471e-8,-0.000005149714979779674,-77.15787506103516,8.015119590254471e-8,-0.000005149714979779674,-77.15787506103516,8.015119590254471e-8,-0.000005149714979779674,-77.15787506103516,8.015119590254471e-8,-0.000005149714979779674,-77.15787506103516,8.015119590254471e-8,-0.000005149714979779674,-77.15787506103516,8.015119590254471e-8],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [0.276015043258667,-0.6926735639572144,0.6663474440574646,0.27601727843284607,-0.6926627159118652,0.6663578748703003,0.2760189175605774,-0.692660391330719,0.6663596630096436,0.2760222256183624,-0.6926570534706116,0.6663616299629211,0.276040256023407,-0.6926739811897278,0.6663366556167603,0.276040256023407,-0.6926739811897278,0.6663366556167603,-0.25681689381599426,0.6585057377815247,0.707400381565094,-0.25677764415740967,0.6585237979888916,0.7073978781700134,-0.25676974654197693,0.6585195064544678,0.7074047327041626,-0.25676843523979187,0.658514142036438,0.7074101567268372,-0.25676360726356506,0.6585231423377991,0.7074034810066223,0.6817693710327148,-0.6585230231285095,0.3186502456665039,0.6817746758460999,-0.6585193276405334,0.31864672899246216,0.6817750930786133,-0.6585239171981812,0.3186362087726593,0.6817806363105774,-0.6585127711296082,0.3186471462249756,0.6818035244941711,-0.6585102081298828,0.3186035752296448,-0.27603888511657715,-0.6926746368408203,-0.6663365960121155,-0.27603888511657715,-0.6926746368408203,-0.6663365960121155,-0.2760240435600281,-0.6926567554473877,-0.6663613319396973,-0.27601906657218933,-0.6926603317260742,-0.6663596034049988,-0.276016503572464,-0.6926576495170593,-0.6663634777069092,0.31860223412513733,0.6585102677345276,-0.6818041205406189,0.31864118576049805,0.6585193872451782,-0.6817771792411804,0.31864672899246216,0.6585192680358887,-0.6817746162414551,0.31865164637565613,0.6585074067115784,-0.6817838549613953,0.3186781108379364,0.6585215926170349,-0.6817577481269836,0.2567409873008728,0.6585215926170349,0.7074131965637207,0.2567734122276306,0.6585090756416321,0.7074129581451416,0.2567753195762634,0.6585192680358887,0.7074028849601746,0.2567766308784485,0.6585201025009155,0.7074016332626343,0.25684815645217896,0.6585031747817993,0.7073915004730225,0.2568749189376831,0.6584857106208801,0.707397997379303,-0.6663634181022644,0.6926576495170593,0.2760165333747864,-0.6663627028465271,0.6926561594009399,0.27602237462997437,-0.6663594245910645,0.6926605105400085,0.27601903676986694,-0.666336178779602,0.6926746368408203,0.2760397791862488,-0.666336178779602,0.6926746368408203,0.2760397791862488,-0.6818409562110901,0.6584908962249756,-0.3185632526874542,-0.6818210482597351,0.6585003733634949,-0.3185865879058838,-0.6817838549613953,0.6585077047348022,-0.3186509609222412,-0.6817764043807983,0.6585201025009155,-0.3186413049697876,-0.6817750930786133,0.6585239171981812,-0.31863611936569214,-0.6817746162414551,0.6585193872451782,-0.3186466097831726,-0.6817693710327148,0.6585230827331543,-0.3186500072479248,0.7073933482170105,-0.6585105061531067,-0.256823867559433,0.7073962092399597,-0.6585232615470886,-0.2567831575870514,0.7074015736579895,-0.6585202813148499,-0.2567760646343231,0.7074017524719238,-0.6585232019424438,-0.25676846504211426,0.707402765750885,-0.658519446849823,-0.25677525997161865,0.7074130177497864,-0.6585090756416321,-0.2567734122276306,0.6663360595703125,-0.6926746964454651,-0.27603980898857117,0.6663360595703125,-0.6926746964454651,-0.27603980898857117,0.6663508415222168,-0.6926715970039368,-0.276012122631073,0.6663575768470764,-0.6926620602607727,-0.27601906657218933,0.6663594841957092,-0.6926604509353638,-0.2760190963745117,0.6663633584976196,-0.6926577091217041,-0.27601656317710876,0.6817554831504822,-0.6585215926170349,-0.31868305802345276,0.6817722320556641,-0.6585193276405334,-0.3186517655849457,0.6817790865898132,-0.6585125923156738,-0.3186511695384979,0.6818022131919861,-0.6585102677345276,-0.3186061382293701,0.2567366063594818,-0.65851891040802,-0.7074173092842102,0.2567683160305023,-0.6585140228271484,-0.7074102163314819,0.2567698359489441,-0.6585193872451782,-0.7074047923088074,0.25684165954589844,-0.6584954261779785,-0.7074009776115417,0.25686919689178467,-0.6584891676902771,-0.7073968052864075,0.3186025023460388,-0.6585103273391724,-0.6818039417266846,0.3186361789703369,-0.6585239768028259,-0.6817750930786133,0.3186422288417816,-0.6585192084312439,-0.6817768216133118,0.31864655017852783,-0.6585193276405334,-0.6817747354507446,0.3186500072479248,-0.6585085988044739,-0.6817831993103027,0.3186507225036621,-0.6585209369659424,-0.6817711591720581,0.6817664504051208,0.6585237383842468,-0.31865495443344116,0.6817724108695984,0.6585192084312439,-0.3186517655849457,0.6817728281021118,0.6585238575935364,-0.31864115595817566,0.6817781925201416,0.6585131287574768,-0.31865185499191284,0.681801974773407,0.6585103869438171,-0.31860649585723877,0.7073934674263,0.6585009098052979,-0.25684863328933716,0.707394540309906,0.6584897637367249,-0.2568739354610443,0.7074029445648193,0.6585192680358887,-0.25677525997161865,0.70740807056427,0.6585136651992798,-0.2567750811576843,0.707412600517273,0.6585222482681274,-0.2567406892776489,-0.318678081035614,0.6585216522216797,0.6817576885223389,-0.3186471462249756,0.6585129499435425,0.6817804574966431,-0.3186464309692383,0.658519446849823,0.6817746758460999,-0.31860098242759705,0.6585105657577515,0.681804358959198,-0.6818021535873413,-0.6585102677345276,0.3186064064502716,-0.6817792654037476,-0.6585121750831604,0.3186511993408203,-0.6817723512649536,-0.6585192680358887,0.31865155696868896,-0.6817554831504822,-0.6585215926170349,0.31868308782577515,-0.7074131965637207,0.6585215926170349,0.2567409873008728,-0.7074130773544312,0.6585090756416321,0.2567734122276306,-0.7074027061462402,0.6585195064544678,0.2567752003669739,-0.7074015140533447,0.6585204005241394,0.25677624344825745,-0.7073948979377747,0.6584895253181458,0.25687336921691895,-0.7073922157287598,0.6585012078285217,0.25685107707977295,-0.681803286075592,-0.6585100293159485,-0.3186042904853821,-0.681780993938446,-0.6585121750831604,-0.3186477720737457,-0.6817747354507446,-0.6585192084312439,-0.31864655017852783,-0.6817577481269836,-0.6585215926170349,-0.3186781406402588,0.6663422584533691,0.6926707029342651,0.27603498101234436,0.6663422584533691,0.6926707029342651,0.27603498101234436,0.6663618087768555,0.6926602721214294,0.27601414918899536,0.6663632988929749,0.6926569938659668,0.27601855993270874,0.6663657426834106,0.6926578283309937,0.27601078152656555,-0.276034414768219,0.6926738619804382,0.666339099407196,-0.276034414768219,0.6926738619804382,0.666339099407196,-0.27601510286331177,0.6926615834236145,0.6663600206375122,-0.27601391077041626,0.6926605701446533,0.6663616299629211,-0.2760116159915924,0.6926630735397339,0.6663599014282227,-0.2760094106197357,0.6926736831665039,0.6663497686386108,-0.2760079801082611,0.6926721930503845,0.666351854801178,0.2760111689567566,0.6926732659339905,0.6663495302200317,0.27601638436317444,0.6926575303077698,0.666363537311554,0.276017963886261,0.692661464214325,0.6663587093353271,0.2760191559791565,0.6926603317260742,0.6663596034049988,0.2760407030582428,0.6926730871200562,0.6663374900817871,0.2760407030582428,0.6926730871200562,0.6663374900817871,-0.27603691816329956,-0.6926735043525696,0.6663385629653931,-0.27603691816329956,-0.6926735043525696,0.6663385629653931,-0.27601784467697144,-0.6926572918891907,0.6663633584976196,-0.2760142683982849,-0.692660391330719,0.6663615703582764,-0.2760106921195984,-0.6926577687263489,0.6663656830787659,-0.6663632392883301,-0.6926574110984802,0.27601781487464905,-0.6663596034049988,-0.692660391330719,0.276018887758255,-0.666358232498169,-0.6926620006561279,0.2760181128978729,-0.6663506031036377,-0.6926716566085815,0.27601203322410583,-0.6663397550582886,-0.6926713585853577,0.2760394513607025,-0.6663397550582886,-0.6926713585853577,0.2760394513607025,-0.6663616299629211,-0.6926603317260742,-0.2760140001773834,-0.6663612723350525,-0.6926611661911011,-0.2760130763053894,-0.6663604378700256,-0.6926630735397339,-0.2760102152824402,-0.6663517951965332,-0.6926720142364502,-0.27600860595703125,-0.6663496494293213,-0.6926732659339905,-0.2760104537010193,-0.6663398742675781,-0.6926730871200562,-0.27603474259376526,-0.6663398742675781,-0.6926730871200562,-0.27603474259376526,-0.318651407957077,-0.6585085988044739,0.6817827820777893,-0.31865057349205017,-0.6585232019424438,0.6817690134048462,-0.3186468183994293,-0.6585192680358887,0.6817746758460999,-0.31864237785339355,-0.6585188508033752,0.6817769408226013,-0.3186362087726593,-0.6585239768028259,0.6817749738693237,-0.3185986876487732,-0.6585110425949097,0.6818050146102905,-0.6818026900291443,0.6585108637809753,0.3186039626598358,-0.6817818284034729,0.6585076451301575,0.31865543127059937,-0.681774914264679,0.6585193276405334,0.3186458647251129,-0.6817728281021118,0.6585239171981812,0.31864118576049805,-0.6817721724510193,0.6585193872451782,0.3186517059803009,-0.6817666888237,0.6585231423377991,0.3186558485031128,-0.25682297348976135,-0.6585092544555664,-0.7073948383331299,-0.25678229331970215,-0.6585257649421692,-0.7073943018913269,-0.25677669048309326,-0.6585200428962708,-0.7074015140533447,-0.2567752003669739,-0.6585193276405334,-0.7074028849601746,-0.25677335262298584,-0.6585087776184082,-0.7074132561683655,-0.25676870346069336,-0.6585231423377991,-0.7074016332626343,0.7073953151702881,0.6585105657577515,0.25681835412979126,0.7073976993560791,0.6585239768028259,0.2567773759365082,0.7074037194252014,0.6585230827331543,0.25676336884498596,0.7074037790298462,0.6585202813148499,0.25676998496055603,0.7074049115180969,0.6585192680358887,0.2567700147628784,0.707414984703064,0.658509373664856,0.2567674517631531,0.6817577481269836,0.6585216522216797,0.3186781108379364,0.6817748546600342,0.6585191488265991,0.3186466693878174,0.6817762851715088,0.6585201025009155,0.31864142417907715,0.6817829012870789,0.6585080027580261,0.31865206360816956,0.6818039417266846,0.6585102081298828,0.3186025619506836,0.7073953747749329,-0.6585008502006531,0.25684332847595215,0.7073964476585388,-0.6584898233413696,0.25686851143836975,0.7074047327041626,-0.6585193872451782,0.2567700147628784,0.7074100375175476,-0.6585139036178589,0.25676897168159485,0.7074150443077087,-0.6585217118263245,0.2567354738712311,0.31860607862472534,-0.6585102677345276,0.6818023324012756,0.31864601373672485,-0.6585190892219543,0.6817750334739685,0.31865158677101135,-0.6585192680358887,0.6817724108695984,0.3186558485031128,-0.6585085988044739,0.6817806363105774,0.31868311762809753,-0.6585216522216797,0.6817553639411926,0.31860703229904175,0.658510148525238,0.6818019151687622,0.3186412453651428,0.6585239768028259,0.6817727088928223,0.31865087151527405,0.6585137248039246,0.6817781329154968,0.31865182518959045,0.6585192084312439,0.6817723512649536,0.3186556100845337,0.6585230827331543,0.6817667484283447,-0.707414984703064,0.6585217118263245,-0.25673556327819824,-0.7074099779129028,0.6585142612457275,-0.2567688226699829,-0.7074046730995178,0.6585195064544678,-0.25676992535591125,-0.7073950171470642,0.658510684967041,-0.25681883096694946,-0.666364312171936,0.6926564574241638,-0.2760176658630371,-0.6663615703582764,0.6926605105400085,-0.2760140895843506,-0.6663599610328674,0.6926629543304443,-0.2760114371776581,-0.6663492918014526,0.6926740407943726,-0.27600976824760437,-0.6663401126861572,0.692672848701477,-0.276034951210022,-0.6663401126861572,0.692672848701477,-0.276034951210022,-0.3186555504798889,0.6585217118263245,-0.6817682385444641,-0.3186514973640442,0.6585192680358887,-0.6817724108695984,-0.31865087151527405,0.6585137248039246,-0.6817781329154968,-0.3186410963535309,0.6585239768028259,-0.6817727088928223,-0.31860843300819397,0.6585099697113037,-0.6818014979362488,-0.25687503814697266,0.6584945321083069,-0.7073897123336792,-0.25684797763824463,0.6585018634796143,-0.7073926329612732,-0.25677669048309326,0.6585201025009155,-0.7074015736579895,-0.25677499175071716,0.6585193276405334,-0.7074029445648193,-0.2567721903324127,0.6585090160369873,-0.7074134349822998,-0.256741464138031,0.6585198640823364,-0.7074146270751953,-0.2760404050350189,0.6926735043525696,-0.6663371324539185,-0.2760404050350189,0.6926735043525696,-0.6663371324539185,-0.27601927518844604,0.6926617622375488,-0.6663580536842346,-0.27601882815361023,0.692660391330719,-0.6663596630096436,-0.27601534128189087,0.6926579475402832,-0.6663636565208435,-0.2760111093521118,0.6926732659339905,-0.666349470615387,0.25676339864730835,0.6585231423377991,-0.7074035406112671,0.2567683756351471,0.658514142036438,-0.7074102163314819,0.2567700743675232,0.6585193872451782,-0.7074046730995178,0.2567768692970276,0.6585267186164856,-0.7073954343795776,0.25681787729263306,0.6585150361061096,-0.7073912620544434,0.27600938081741333,0.6926736831665039,-0.6663497090339661,0.27601268887519836,0.6926624774932861,-0.6663600206375122,0.27601420879364014,0.692660391330719,-0.6663615703582764,0.2760183811187744,0.6926562786102295,-0.6663641929626465,0.27603667974472046,0.692672848701477,-0.6663392782211304,0.27603667974472046,0.692672848701477,-0.6663392782211304,0.6663398146629333,0.6926707625389099,-0.2760407030582428,0.6663398146629333,0.6926707625389099,-0.2760407030582428,0.666347861289978,0.6926729083061218,-0.2760158181190491,0.6663495898246765,0.6926727294921875,-0.27601224184036255,0.666358232498169,0.6926625370979309,-0.2760171592235565,0.6663585901260376,0.6926613450050354,-0.27601903676986694,0.6663596630096436,0.6926603317260742,-0.2760190963745117,0.27600938081741333,-0.6926738023757935,-0.6663495302200317,0.27601149678230286,-0.6926628947257996,-0.6663601398468018,0.2760140001773834,-0.6926604509353638,-0.6663616299629211,0.2760170102119446,-0.6926567554473877,-0.6663640737533569,0.27603477239608765,-0.6926739811897278,-0.6663388609886169,0.27603477239608765,-0.6926739811897278,-0.6663388609886169,0.6663395166397095,-0.6926735043525696,0.2760348320007324,0.6663395166397095,-0.6926735043525696,0.2760348320007324,0.6663496494293213,-0.69267338514328,0.2760099768638611,0.6663513779640198,-0.6926727294921875,0.2760077118873596,0.6663597822189331,-0.6926623582839966,0.27601343393325806,0.6663600206375122,-0.6926628947257996,0.2760114371776581,0.6663615703582764,-0.6926604509353638,0.27601417899131775,-0.2568694055080414,-0.6584880352020264,0.7073978185653687,-0.25684303045272827,-0.658505916595459,0.7073907852172852,-0.25677070021629333,-0.6585201025009155,0.7074036002159119,-0.2567701041698456,-0.6585193276405334,0.7074047327041626,-0.2567673623561859,-0.6585090160369873,0.7074152231216431,-0.25673583149909973,-0.6585217118263245,0.7074149250984192,0.25676846504211426,-0.6585231423377991,0.7074017524719238,0.2567743957042694,-0.6585140228271484,0.7074080109596252,0.2567751109600067,-0.6585193276405334,0.7074029445648193,0.25678279995918274,-0.6585239768028259,0.7073957920074463,0.256822794675827,-0.6585081815719604,0.7073959708213806,-0.7074099779129028,-0.6585137248039246,-0.25676944851875305,-0.7074047923088074,-0.6585192680358887,-0.2567698359489441,-0.7074031233787537,-0.6585232019424438,-0.25676456093788147,-0.7073982357978821,-0.658488929271698,-0.2568660080432892,-0.7073976397514343,-0.6585239171981812,-0.2567775249481201,-0.707395076751709,-0.6585009098052979,-0.25684383511543274,-0.7074130177497864,-0.6585085988044739,0.25677454471588135,-0.7074028849601746,-0.6585193872451782,0.2567750811576843,-0.7074017524719238,-0.6585231423377991,0.2567686140537262,-0.7074016332626343,-0.6585202813148499,0.2567755877971649,-0.7073957920074463,-0.6585239171981812,0.2567828893661499,-0.7073920369148254,-0.6585111021995544,0.2568261921405792,-0.31868305802345276,-0.6585215926170349,-0.6817554235458374,-0.3186575174331665,-0.658507764339447,-0.6817806363105774,-0.3186517059803009,-0.6585192084312439,-0.6817723512649536,-0.3186461925506592,-0.658518373966217,-0.6817757487297058,-0.3185906708240509,-0.6585003137588501,-0.6818190813064575,-0.3185673952102661,-0.6584908366203308,-0.6818392276763916,0.000001342588575425907,1,-7.968073134634324e-8,0.000001342588575425907,1,-7.968073134634324e-8,0.000001342588575425907,1,-7.968073134634324e-8,0.000001342588575425907,1,-7.968073134634324e-8,0.000001342588575425907,1,-7.968073134634324e-8,0.000001342588575425907,1,-7.968073134634324e-8,0.000001342588575425907,1,-7.968073134634324e-8,0.000001342588575425907,1,-7.968073134634324e-8,-7.788058837832068e-7,-1,-7.342277541511066e-8,-7.788058837832068e-7,-1,-7.342277541511066e-8,-7.788058837832068e-7,-1,-7.342277541511066e-8,-7.788058837832068e-7,-1,-7.342277541511066e-8,-7.788058837832068e-7,-1,-7.342277541511066e-8,-7.788058837832068e-7,-1,-7.342277541511066e-8,-7.788058837832068e-7,-1,-7.342277541511066e-8,-7.788058837832068e-7,-1,-7.342277541511066e-8],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.03048560582101345,0.01567864418029785,0.03048560582101345,0.01567864418029785,0.4374997317790985,0.2620980143547058,0.03719213604927063,0.12196230888366699,0.034566912800073624,0.013053596019744873,0.04797939583659172,0.007471561431884766,0.023779170587658882,0.004848778247833252,0.11408431828022003,0.12196230888366699,0.09070630371570587,0.23767399787902832,0.07480431348085403,0.01567620038986206,0.11408431828022003,0.12196230888366699,0.11983299255371094,0.12196230888366699,0.3407820463180542,0.3628087639808655,0.11983299255371094,0.12196230888366699,0.041273150593042374,0.015676438808441162,0.004617570899426937,0.005231618881225586,0.08821681886911392,0.00785917043685913,0.104537233710289,0.00896519422531128,0.017072739079594612,0.12196230888366699,0.3124997019767761,0.3871912360191345,0.04389829561114311,0.015676259994506836,0.034566912800073624,0.004848778247833252,0.014447606168687344,0.12196230888366699,0.5343227386474609,0.23762238025665283,0.014447606168687344,0.12196230888366699,0.12820686399936676,0.06416767835617065,0.11096081137657166,0.06416738033294678,0.0707232654094696,0.01567620038986206,0.15942715108394623,0.23743665218353271,0.0707232654094696,0.01567620038986206,0.023779170587658882,0.0007677078247070312,0.023779170587658882,0.0007677078247070312,0.07742954790592194,0.12196230888366699,0.007741174660623074,0.12196230888366699,0.5624786019325256,0.012261509895324707,0.061391860246658325,0.013051092624664307,0.07480429112911224,0.007857918739318848,0.01348982285708189,0.004848778247833252,0.01348982285708189,0.004848778247833252,0.027860479429364204,0.12196230888366699,0.027860479429364204,0.12196230888366699,0.12245811522006989,0.06416767835617065,0.4092179536819458,0.11280876398086548,0.12245811522006989,0.06416767835617065,0.07072323560714722,0.005232870578765869,0.12245811522006989,0.06679385900497437,0.06401706486940384,0.12196230888366699,0.12245811522006989,0.06679385900497437,0.21575646102428436,0.36276328563690186,0.06401706486940384,0.12196230888366699,0.05060452222824097,0.007858037948608398,0.06809809058904648,0.007857978343963623,0.09084202349185944,0.12196230888366699,0.09084202349185944,0.12196230888366699,0.18749970197677612,0.26223671436309814,0.06401699781417847,0.015676140785217285,0.12245821952819824,0.12196230888366699,0.15924353897571564,0.36276328563690186,0.09084194898605347,0.015676438808441162,0.03144339099526405,0.000767827033996582,0.13133037090301514,0.003871619701385498,0.04797939583659172,0.12196230888366699,0.03418757766485214,0.362862765789032,0.08725927770137787,0.005232870578765869,0.08725927770137787,0.005232870578765869,0.03144339099526405,0.004848778247833252,0.13133037090301514,0.06416767835617065,0.09492307156324387,0.015676438808441162,0.09081242233514786,0.362862765789032,0.09492307156324387,0.015676438808441162,0.13133037090301514,0.06416767835617065,0.1255817413330078,0.12196230888366699,0.4657820463180542,0.23780876398086548,0.1255817413330078,0.12196230888366699,0.01036630105227232,0.12196230888366699,0.034566912800073624,0.000767827033996582,0.07384677231311798,0.005232870578765869,0.07384677231311798,0.005232870578765869,0.4092180132865906,0.23780876398086548,0.057310834527015686,0.015676259994506836,0.1255817413330078,0.06679385900497437,0.11408431828022003,0.0667925477027893,0.0036600297316908836,0.015675067901611328,0.03429369255900383,0.23767399787902832,0.06497455388307571,0.0011516809463500977,0.06809809058904648,0.005232870578765869,0.09754816442728043,0.015677452087402344,0.15919587016105652,0.48784810304641724,0.12820686399936676,0.12196230888366699,0.13133040070533752,0.06679350137710571,0.07742944359779358,0.01567739248275757,0.5342592000961304,0.11273849010467529,0.07742944359779358,0.01567739248275757,0.05060454457998276,0.0011516809463500977,0.05060454457998276,0.0011516809463500977,0.01036630105227232,0.004848778247833252,0.021154051646590233,0.01567864418029785,0.09083183109760284,0.4878973960876465,0.12558168172836304,0.06416767835617065,0.017355674877762794,0.008966445922851562,0.07771223783493042,0.011559724807739258,0.3124997019767761,0.1371912956237793,0.10425447672605515,0.12196230888366699,0.06139186769723892,0.12196230888366699,0.07072321325540543,0.007857918739318848,0.09112466126680374,0.011558711528778076,0.003660283051431179,0.12196230888366699,0.06249973922967911,0.13732600212097168,0.07480431348085403,0.12196230888366699,0.07480431348085403,0.12196230888366699,0.003660283051431179,0.12196230888366699,0.10833562910556793,0.12196230888366699,0.07072321325540543,0.12196230888366699,0.10833562910556793,0.12196230888366699,0.1875002682209015,0.13756322860717773,0.021154051646590233,0.007474005222320557,0.09492305666208267,0.013051152229309082,0.04418101906776428,0.008964121341705322,0.09783096611499786,0.011559903621673584,0.10162932425737381,0.12196230888366699,0.5625002384185791,0.26224493980407715,0.034566912800073624,0.01567864418029785,0.08821682631969452,0.12196230888366699,0.1874997317790985,0.387151837348938,0.09754827618598938,0.12196230888366699,0.09754827618598938,0.12196230888366699,0.007741096429526806,0.00785684585571289,0.1016293466091156,0.013052403926849365,0.06250026077032089,0.3871026635169983,0.021154044196009636,0.12196230888366699,0.08413578569889069,0.12196230888366699,0.021154044196009636,0.12196230888366699,0.08413578569889069,0.12196230888366699,0.0036600297316908836,0.00785684585571289,0.10833562910556793,0.0074727535247802734,0.10162932425737381,0.015677452087402344,0.11096075177192688,0.0667925477027893,0.5907518267631531,0.3627550005912781,0.10162932425737381,0.015677452087402344,0.11096075177192688,0.0667925477027893,0.06809809058904648,0.0011516809463500977,0.06497455388307571,0.005232870578765869,0.007741174660623074,0.015675067901611328,0.007741174660623074,0.015675067901611328,0.13133040070533752,0.12196230888366699,0.5907407999038696,0.11272633075714111,0.13133040070533752,0.12196230888366699,0.08725927770137787,0.0011516809463500977,0.11670946329832077,0.003871321678161621,0.04389836639165878,0.12196230888366699,0.3407820463180542,0.4878087639808655,0.04389836639165878,0.12196230888366699,0.11670946329832077,0.003871321678161621,0.07384677231311798,0.0011516809463500977,0.11670953035354614,0.06679290533065796,0.11670953035354614,0.06679290533065796,0.06139186769723892,0.015676259994506836,0.34078195691108704,0.2378087043762207,0.06139186769723892,0.015676259994506836,0.11670944094657898,0.12196230888366699,0.2842180132865906,0.2378087043762207,0.1042545735836029,0.01567751169204712,0.1042545735836029,0.01567751169204712,0.007741096429526806,0.005231618881225586,0.07072323560714722,0.0011516809463500977,0.07072323560714722,0.0011516809463500977,0.2842179536819458,0.3628087639808655,0.06809809058904648,0.12196230888366699,0.11983299255371094,0.06679290533065796,0.004617570899426937,0.0011506080627441406,0.03719203174114227,0.015676438808441162,0.40916556119918823,0.3629019856452942,0.03719203174114227,0.015676438808441162,0.11408430337905884,0.003871619701385498,0.007741096429526806,0.0011506080627441406,0.11096075177192688,0.003871619701385498,0.10833562910556793,0.01567751169204712,0.21557284891605377,0.23743665218353271,0.11096075177192688,0.003871619701385498,0.12245815992355347,0.003871917724609375,0.08151060342788696,0.01567739248275757,0.4657820463180542,0.11280876398086548,0.05060454457998276,0.005232870578765869,0.02786046452820301,0.01567864418029785,0.4374997317790985,0.012191295623779297,0.08151060342788696,0.12196230888366699,0.08151060342788696,0.12196230888366699,0.01036630105227232,0.008966505527496338,0.05759349465370178,0.011558592319488525,0.11983299255371094,0.06416738033294678,0.3407820463180542,0.1128087043762207,0.02377944253385067,0.12196230888366699,0.11983299255371094,0.06416738033294678,0.01348982285708189,0.000767827033996582,0.0841357409954071,0.0011516809463500977,0.0841357409954071,0.0011516809463500977,0.05060460418462753,0.015676259994506836,0.2842179536819458,0.11280876398086548,0.05060460418462753,0.015676259994506836,0.11983299255371094,0.003871321678161621,0.014164685271680355,0.007474005222320557,0.03719203174114227,0.008964121341705322,0.023779170587658882,0.01567864418029785,0.31250008940696716,0.012191236019134521,0.05060452222824097,0.12196230888366699,0.023779170587658882,0.01567864418029785,0.12820683419704437,0.0038716793060302734,0.05468563735485077,0.01567620038986206,0.5906772613525391,0.23762238025665283,0.12820683419704437,0.0038716793060302734,0.0841357409954071,0.005232870578765869,0.05468563735485077,0.12196230888366699,0.05468563735485077,0.12196230888366699,0.5624997615814209,0.1373775601387024,0.014447621069848537,0.015678703784942627,0.02377917803823948,0.008966445922851562,0.040990397334098816,0.007471561431884766,0.027577554807066917,0.007474005222320557,0.08151061087846756,0.01305234432220459,0.05731076002120972,0.12196230888366699,0.010366610251367092,0.015678703784942627,0.05731076002120972,0.12196230888366699,0.010366610251367092,0.015678703784942627,0.4375002980232239,0.13719123601913452,0.04797941446304321,0.015676259994506836,0.04797941446304321,0.015676259994506836,0.06250029802322388,0.262137234210968,0.09492305666208267,0.12196230888366699,0.05468561500310898,0.007858037948608398,0.08413572609424591,0.00785917043685913,0.03076852671802044,0.011561095714569092,0.06401699781417847,0.007857978343963623,0.06809809058904648,0.015676140785217285,0.04127315804362297,0.12196230888366699,0.04127315804362297,0.12196230888366699,0.06809809058904648,0.015676140785217285,0.3125002682209015,0.26219117641448975,0.026902692392468452,0.004848778247833252,0.026902692392468452,0.004848778247833252,0.034566912800073624,0.12196230888366699,0.5342481732368469,0.3627550005912781,0.034566912800073624,0.12196230888366699,0.11096090078353882,0.12196230888366699,0.11408430337905884,0.06416738033294678,0.03048589639365673,0.12196230888366699,0.46583443880081177,0.3629019856452942,0.11408430337905884,0.06416738033294678,0.026902692392468452,0.0007677078247070312,0.08413572609424591,0.015676140785217285,0.034168168902397156,0.4878973960876465,0.12558168172836304,0.003871917724609375,0.05372808128595352,0.005232870578765869,0.12558168172836304,0.003871917724609375,0.05372808128595352,0.005232870578765869,0.08821682631969452,0.015676140785217285,0.21580412983894348,0.48784810304641724,0.12820687890052795,0.06679350137710571,0.08821682631969452,0.015676140785217285,0.12820687890052795,0.06679350137710571,0.05372808128595352,0.0011516809463500977,0.11670944094657898,0.06416738033294678,0.01707303337752819,0.01567864418029785,0.2842179536819458,0.4878087639808655,0.01707303337752819,0.01567864418029785,0.01036630105227232,0.000767827033996582,0.01036630105227232,0.000767827033996582,0.014164685271680355,0.013053655624389648,0.021154051646590233,0.013053596019744873,0.027577554807066917,0.013053596019744873,0.040990397334098816,0.013051152229309082,0.061391860246658325,0.00747150182723999,0.07276374846696854,0.013051033020019531,0.08151061087846756,0.007472634315490723,0.09492305666208267,0.007471621036529541,0.005700557492673397,0.013049840927124023,0.034566912800073624,0.007474005222320557,0.04797939583659172,0.013051152229309082,0.052645064890384674,0.013051152229309082,0.06605753302574158,0.013051152229309082,0.08617626875638962,0.01305234432220459,0.1016293466091156,0.0074727535247802734,0.10833562910556793,0.013052403926849365],\n \"normalized\": false\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [97,128,249,171,245,2,83,8,107,137,120,240,12,236,166,262,150,19,23,208,213,190,203,197,78,72,223,101,160,157,255,123,87,114,28,177,91,145,34,42,181,184,48,54,57,238,31,6,76,165,44,254,130,122,108,27,112,126,133,274,192,152,260,142,106,33,38,265,95,253,93,182,185,90,32,239,0,244,69,53,227,212,198,204,161,111,176,129,261,18,85,84,141,258,146,89,13,155,159,219,156,79,139,10,81,169,163,174,170,233,14,21,59,65,125,138,86,73,47,56,40,205,191,224,149,61,246,178,26,222,24,214,250,41,98,232,46,167,209,70,60,63,194,210,68,226,62,36,104,271,105,116,273,115,99,267,100,218,272,217,215,268,216,201,269,200,187,266,188,35,270,134,17,281,16,229,279,228,50,277,51,231,278,230,4,275,5,117,276,118,127,280,237,247,30,77,153,164,257,248,132,109,9,29,189,199,148,143,82,110,37,193,264,251,259,94,186,180,92,241,121,1,67,58,52,211,207,196,162,102,113,131,96,263,85,140,84,256,88,144,11,168,154,221,103,158,136,242,7,169,15,163,172,3,234,21,75,59,124,119,135,71,80,45,39,183,202,225,20,151,243,173,175,220,74,22,252,179,43,235,55,49,206,25,66,64,147,195]\n },\n \"boundingSphere\": {\n \"center\": [0,0,0],\n \"radius\": 135.51845097955697\n }\n },\n faceValues: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],\n rotationCombinations: {\n \"1,2\": [-1, -46, -1],\n \"1,3\": [44, -91, 44],\n \"1,4\": [0, -135, 0],\n \"1,5\": [-1, 179, 1],\n \"1,6\": [-1, 134, 1],\n \"1,7\": [44, 89, -44],\n \"1,8\": [1, 44, -2],\n \"1,9\": [-1, 0, 180],\n \"1,10\": [-2, -45, 179],\n \"1,11\": [-103, -89, 78],\n \"1,12\": [-180, -45, 0],\n \"1,13\": [179, 2, 1],\n \"1,14\": [179, 46, 1],\n \"1,15\": [13, 89, 166],\n \"1,16\": [0, 44, 179],\n \"2,3\": [0, -45, 0],\n \"2,4\": [43, -90, 43],\n \"2,5\": [0, -135, 0],\n \"2,6\": [0, 180, 0],\n \"2,7\": [0, 135, 0],\n \"2,8\": [38, 89, -39],\n \"2,9\": [0, 45, -180],\n \"2,10\": [0, 0, 180],\n \"2,11\": [-1, -45, 179],\n \"2,12\": [-3, -89, 177],\n \"2,13\": [-180, -44, 1],\n \"2,14\": [-179, 0, 0],\n \"2,15\": [-179, 45, 0],\n \"2,16\": [-6, 90, -174],\n \"3,4\": [0, -45, 0],\n \"3,5\": [-54, -90, -54],\n \"3,6\": [0, -135, 0],\n \"3,7\": [0, -180, 0],\n \"3,8\": [-1, 134, 0],\n \"3,9\": [-177, 90, -3],\n \"3,10\": [-1, 45, -180],\n \"3,11\": [-1, 0, 180],\n \"3,12\": [0, -44, 179],\n \"3,13\": [-179, -89, 2],\n \"3,14\": [-179, -45, 1],\n \"3,15\": [-180, 0, 0],\n \"3,16\": [-180, 45, 0],\n \"4,5\": [0, -45, 1],\n \"4,6\": [-47, -90, -47],\n \"4,7\": [-1, -135, 0],\n \"4,8\": [-1, 179, -1],\n \"4,9\": [-180, 45, 0],\n \"4,10\": [-98, 89, -83],\n \"4,11\": [-1, 45, -179],\n \"4,12\": [0, 1, 180],\n \"4,13\": [0, -46, -179],\n \"4,14\": [-161, -89, 20],\n \"4,15\": [180, -44, 0],\n \"4,16\": [180, 1, 0],\n \"5,6\": [-1, -45, 0],\n \"5,7\": [-60, -90, -59],\n \"5,8\": [-1, -136, -1],\n \"5,9\": [180, -1, 1],\n \"5,10\": [180, 44, 0],\n \"5,11\": [-159, 89, -21],\n \"5,12\": [0, 46, 179],\n \"5,13\": [0, -1, -180],\n \"5,14\": [-1, -45, 179],\n \"5,15\": [-109, -89, 72],\n \"5,16\": [-180, -45, 0],\n \"6,7\": [0, -45, 0],\n \"6,8\": [-38, -91, -39],\n \"6,9\": [-180, -45, 0],\n \"6,10\": [-180, 0, 0],\n \"6,11\": [-179, 45, -1],\n \"6,12\": [-177, 89, -3],\n \"6,13\": [0, 44, -179],\n \"6,14\": [-1, 0, -180],\n \"6,15\": [-1, -45, 180],\n \"6,16\": [-174, -90, 6],\n \"7,8\": [1, -46, 0],\n \"7,9\": [-3, -90, 177],\n \"7,10\": [-179, -45, 0],\n \"7,11\": [-179, 0, 0],\n \"7,12\": [-180, 44, -1],\n \"7,13\": [-1, 89, -178],\n \"7,14\": [-1, 45, -179],\n \"7,15\": [0, 0, -180],\n \"7,16\": [0, -45, 180],\n \"8,9\": [0, -44, -179],\n \"8,10\": [12, -89, -167],\n \"8,11\": [179, -46, -1],\n \"8,12\": [179, -2, -1],\n \"8,13\": [-180, 45, 0],\n \"8,14\": [-109, 89, -71],\n \"8,15\": [-2, 45, -178],\n \"8,16\": [-1, 0, -180],\n \"9,10\": [1, 45, -1],\n \"9,11\": [89, 89, -89],\n \"9,12\": [0, 135, 0],\n \"9,13\": [0, -179, 1],\n \"9,14\": [0, -134, 0],\n \"9,15\": [7, -89, 7],\n \"9,16\": [0, -44, -1],\n \"10,11\": [0, 45, 0],\n \"10,12\": [-9, 89, 8],\n \"10,13\": [0, 136, 1],\n \"10,14\": [-1, -179, 0],\n \"10,15\": [-1, -134, 0],\n \"10,16\": [11, -89, 12],\n \"11,12\": [-1, 45, -1],\n \"11,13\": [4, 91, -4],\n \"11,14\": [-1, 136, 1],\n \"11,15\": [-1, -179, 0],\n \"11,16\": [-1, -134, 0],\n \"12,13\": [-1, 47, 2],\n \"12,14\": [6, 91, -6],\n \"12,15\": [0, 136, 0],\n \"12,16\": [0, -179, -1],\n \"13,14\": [1, 44, -1],\n \"13,15\": [68, 89, -68],\n \"13,16\": [-1, 135, 1],\n \"14,15\": [0, 45, 0],\n \"14,16\": [-86, 90, 85],\n \"15,16\": [0, 45, -1]\n }\n },\n \"d20\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"4947963B-5ABA-4507-A373-1DA7805EB4DE\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-83.39456939697266, 2.066877841949463, 52.33057403564453, -83.39456939697266, 2.066877841949463, 52.33057403564453, -83.39456939697266, 2.066877841949463, 52.33057403564453, -83.39456939697266, 2.066877841949463, 52.33057403564453, -53.607669830322266, 82.60527038574219, 0.00019691196212079376, -53.607669830322266, 82.60527038574219, 0.00019691196212079376, -53.607669830322266, 82.60527038574219, 0.00019691196212079376, -53.607669830322266, 82.60527038574219, 0.00019691196212079376, -84.67233276367188, 1.2774014472961426, -50.26307678222656, -84.67233276367188, 1.2774014472961426, -50.26307678222656, -84.67233276367188, 1.2774014472961426, -50.26307678222656, -84.67233276367188, 1.2774014472961426, -50.26307678222656, -84.67233276367188, -1.2774014472961426, -50.26307678222656, -84.67233276367188, -1.2774014472961426, -50.26307678222656, -84.67233276367188, -1.2774014472961426, -50.26307678222656, -84.67233276367188, -1.2774014472961426, -50.26307678222656, -52.330257415771484, -83.39476013183594, 2.0670700073242188, -52.330257415771484, -83.39476013183594, 2.0670700073242188, -52.330257415771484, -83.39476013183594, 2.0670700073242188, -52.330257415771484, -83.39476013183594, 2.0670700073242188, -1.2770904302597046, -50.263389587402344, 84.67215728759766, -1.2770904302597046, -50.263389587402344, 84.67215728759766, -1.2770904302597046, -50.263389587402344, 84.67215728759766, -1.2770904302597046, -50.263389587402344, 84.67215728759766, -52.33027648925781, 83.39476013183594, -2.066685438156128, -52.33027648925781, 83.39476013183594, -2.066685438156128, -52.33027648925781, 83.39476013183594, -2.066685438156128, -52.33027648925781, 83.39476013183594, -2.066685438156128, -50.26338577270508, 84.67214965820312, 1.2775861024856567, -50.26338577270508, 84.67214965820312, 1.2775861024856567, -50.26338577270508, 84.67214965820312, 1.2775861024856567, -50.26338577270508, 84.67214965820312, 1.2775861024856567, 1.2777124643325806, -50.263389587402344, 84.6721420288086, 1.2777124643325806, -50.263389587402344, 84.6721420288086, 1.2777124643325806, -50.263389587402344, 84.6721420288086, 1.2777124643325806, -50.263389587402344, 84.6721420288086, -2.0671839714050293, -52.330265045166016, -83.39474487304688, -2.0671839714050293, -52.330265045166016, -83.39474487304688, -2.0671839714050293, -52.330265045166016, -83.39474487304688, -2.0671839714050293, -52.330265045166016, -83.39474487304688, 83.39456939697266, 2.066877841949463, -52.33057403564453, 83.39456939697266, 2.066877841949463, -52.33057403564453, 83.39456939697266, 2.066877841949463, -52.33057403564453, 83.39456939697266, 2.066877841949463, -52.33057403564453, 84.67233276367188, 1.2774014472961426, 50.26307678222656, 84.67233276367188, 1.2774014472961426, 50.26307678222656, 84.67233276367188, 1.2774014472961426, 50.26307678222656, 84.67233276367188, 1.2774014472961426, 50.26307678222656, 53.607669830322266, -82.60527038574219, -0.00019691196212079376, 53.607669830322266, -82.60527038574219, -0.00019691196212079376, 53.607669830322266, -82.60527038574219, -0.00019691196212079376, 53.607669830322266, -82.60527038574219, -0.00019691196212079376, 83.39456939697266, -2.066877841949463, -52.33057403564453, 83.39456939697266, -2.066877841949463, -52.33057403564453, 83.39456939697266, -2.066877841949463, -52.33057403564453, 83.39456939697266, -2.066877841949463, -52.33057403564453, 1.2770904302597046, 50.263389587402344, -84.67215728759766, 1.2770904302597046, 50.263389587402344, -84.67215728759766, 1.2770904302597046, 50.263389587402344, -84.67215728759766, 1.2770904302597046, 50.263389587402344, -84.67215728759766, 50.26338577270508, 84.67214965820312, -1.2775861024856567, 50.26338577270508, 84.67214965820312, -1.2775861024856567, 50.26338577270508, 84.67214965820312, -1.2775861024856567, 50.26338577270508, 84.67214965820312, -1.2775861024856567, 83.39495086669922, -2.066877841949463, 52.329959869384766, 83.39495086669922, -2.066877841949463, 52.329959869384766, 83.39495086669922, -2.066877841949463, 52.329959869384766, 83.39495086669922, -2.066877841949463, 52.329959869384766, -50.26339340209961, -84.67214965820312, -1.2772167921066284, -50.26339340209961, -84.67214965820312, -1.2772167921066284, -50.26339340209961, -84.67214965820312, -1.2772167921066284, -50.26339340209961, -84.67214965820312, -1.2772167921066284, -1.2777124643325806, -50.263389587402344, -84.6721420288086, -1.2777124643325806, -50.263389587402344, -84.6721420288086, -1.2777124643325806, -50.263389587402344, -84.6721420288086, -1.2777124643325806, -50.263389587402344, -84.6721420288086, -52.330257415771484, 83.39476013183594, 2.0670700073242188, -52.330257415771484, 83.39476013183594, 2.0670700073242188, -52.330257415771484, 83.39476013183594, 2.0670700073242188, -52.330257415771484, 83.39476013183594, 2.0670700073242188, -82.60507202148438, 0, 53.60797119140625, -82.60507202148438, 0, 53.60797119140625, -82.60507202148438, 0, 53.60797119140625, -82.60507202148438, 0, 53.60797119140625, -2.0665714740753174, 52.330265045166016, 83.39476776123047, -2.0665714740753174, 52.330265045166016, 83.39476776123047, -2.0665714740753174, 52.330265045166016, 83.39476776123047, -2.0665714740753174, 52.330265045166016, 83.39476776123047, -84.67196655273438, -1.2774014472961426, 50.26369857788086, -84.67196655273438, -1.2774014472961426, 50.26369857788086, -84.67196655273438, -1.2774014472961426, 50.26369857788086, -84.67196655273438, -1.2774014472961426, 50.26369857788086, -84.67196655273438, 1.2774014472961426, 50.26369857788086, -84.67196655273438, 1.2774014472961426, 50.26369857788086, -84.67196655273438, 1.2774014472961426, 50.26369857788086, -84.67196655273438, 1.2774014472961426, 50.26369857788086, -53.607669830322266, -82.60527038574219, 0.00019691196212079376, -53.607669830322266, -82.60527038574219, 0.00019691196212079376, -53.607669830322266, -82.60527038574219, 0.00019691196212079376, -53.607669830322266, -82.60527038574219, 0.00019691196212079376, -83.39456939697266, -2.066877841949463, 52.33057403564453, -83.39456939697266, -2.066877841949463, 52.33057403564453, -83.39456939697266, -2.066877841949463, 52.33057403564453, -83.39456939697266, -2.066877841949463, 52.33057403564453, -52.33027648925781, -83.39476013183594, -2.066685438156128, -52.33027648925781, -83.39476013183594, -2.066685438156128, -52.33027648925781, -83.39476013183594, -2.066685438156128, -52.33027648925781, -83.39476013183594, -2.066685438156128, -2.0665714740753174, -52.330265045166016, 83.39476776123047, -2.0665714740753174, -52.330265045166016, 83.39476776123047, -2.0665714740753174, -52.330265045166016, 83.39476776123047, -2.0665714740753174, -52.330265045166016, 83.39476776123047, -1.2770904302597046, 50.263389587402344, 84.67215728759766, -1.2770904302597046, 50.263389587402344, 84.67215728759766, -1.2770904302597046, 50.263389587402344, 84.67215728759766, -1.2770904302597046, 50.263389587402344, 84.67215728759766, -0.0003034261171706021, 53.607669830322266, -82.60527038574219, -0.0003034261171706021, 53.607669830322266, -82.60527038574219, -0.0003034261171706021, 53.607669830322266, -82.60527038574219, -0.0003034261171706021, 53.607669830322266, -82.60527038574219, -2.0671839714050293, 52.330265045166016, -83.39474487304688, -2.0671839714050293, 52.330265045166016, -83.39474487304688, -2.0671839714050293, 52.330265045166016, -83.39474487304688, -2.0671839714050293, 52.330265045166016, -83.39474487304688, -83.39495086669922, 2.066877841949463, -52.329959869384766, -83.39495086669922, 2.066877841949463, -52.329959869384766, -83.39495086669922, 2.066877841949463, -52.329959869384766, -83.39495086669922, 2.066877841949463, -52.329959869384766, 50.26339340209961, 84.67214965820312, 1.2772167921066284, 50.26339340209961, 84.67214965820312, 1.2772167921066284, 50.26339340209961, 84.67214965820312, 1.2772167921066284, 50.26339340209961, 84.67214965820312, 1.2772167921066284, -50.26339340209961, 84.67214965820312, -1.2772167921066284, -50.26339340209961, 84.67214965820312, -1.2772167921066284, -50.26339340209961, 84.67214965820312, -1.2772167921066284, -50.26339340209961, 84.67214965820312, -1.2772167921066284, 2.0671839714050293, 52.330265045166016, 83.39474487304688, 2.0671839714050293, 52.330265045166016, 83.39474487304688, 2.0671839714050293, 52.330265045166016, 83.39474487304688, 2.0671839714050293, 52.330265045166016, 83.39474487304688, 82.60547637939453, 0, 53.607364654541016, 82.60547637939453, 0, 53.607364654541016, 82.60547637939453, 0, 53.607364654541016, 82.60547637939453, 0, 53.607364654541016, 83.39495086669922, 2.066877841949463, 52.329959869384766, 83.39495086669922, 2.066877841949463, 52.329959869384766, 83.39495086669922, 2.066877841949463, 52.329959869384766, 83.39495086669922, 2.066877841949463, 52.329959869384766, 50.26339340209961, -84.67214965820312, 1.2772167921066284, 50.26339340209961, -84.67214965820312, 1.2772167921066284, 50.26339340209961, -84.67214965820312, 1.2772167921066284, 50.26339340209961, -84.67214965820312, 1.2772167921066284, 2.0671839714050293, -52.330265045166016, 83.39474487304688, 2.0671839714050293, -52.330265045166016, 83.39474487304688, 2.0671839714050293, -52.330265045166016, 83.39474487304688, 2.0671839714050293, -52.330265045166016, 83.39474487304688, 50.26338577270508, -84.67214965820312, -1.2775861024856567, 50.26338577270508, -84.67214965820312, -1.2775861024856567, 50.26338577270508, -84.67214965820312, -1.2775861024856567, 50.26338577270508, -84.67214965820312, -1.2775861024856567, -83.39495086669922, -2.066877841949463, -52.329959869384766, -83.39495086669922, -2.066877841949463, -52.329959869384766, -83.39495086669922, -2.066877841949463, -52.329959869384766, -83.39495086669922, -2.066877841949463, -52.329959869384766, -82.60547637939453, 0, -53.607364654541016, -82.60547637939453, 0, -53.607364654541016, -82.60547637939453, 0, -53.607364654541016, -82.60547637939453, 0, -53.607364654541016, 52.330257415771484, 83.39476013183594, -2.0670700073242188, 52.330257415771484, 83.39476013183594, -2.0670700073242188, 52.330257415771484, 83.39476013183594, -2.0670700073242188, 52.330257415771484, 83.39476013183594, -2.0670700073242188, 53.607669830322266, 82.60527038574219, -0.00019691196212079376, 53.607669830322266, 82.60527038574219, -0.00019691196212079376, 53.607669830322266, 82.60527038574219, -0.00019691196212079376, 53.607669830322266, 82.60527038574219, -0.00019691196212079376, 2.0665714740753174, 52.330265045166016, -83.39476776123047, 2.0665714740753174, 52.330265045166016, -83.39476776123047, 2.0665714740753174, 52.330265045166016, -83.39476776123047, 2.0665714740753174, 52.330265045166016, -83.39476776123047, 84.67233276367188, -1.2774014472961426, 50.26307678222656, 84.67233276367188, -1.2774014472961426, 50.26307678222656, 84.67233276367188, -1.2774014472961426, 50.26307678222656, 84.67233276367188, -1.2774014472961426, 50.26307678222656, 84.67196655273438, -1.2774014472961426, -50.26369857788086, 84.67196655273438, -1.2774014472961426, -50.26369857788086, 84.67196655273438, -1.2774014472961426, -50.26369857788086, 84.67196655273438, -1.2774014472961426, -50.26369857788086, 84.67196655273438, 1.2774014472961426, -50.26369857788086, 84.67196655273438, 1.2774014472961426, -50.26369857788086, 84.67196655273438, 1.2774014472961426, -50.26369857788086, 84.67196655273438, 1.2774014472961426, -50.26369857788086, 52.33027648925781, 83.39476013183594, 2.066685438156128, 52.33027648925781, 83.39476013183594, 2.066685438156128, 52.33027648925781, 83.39476013183594, 2.066685438156128, 52.33027648925781, 83.39476013183594, 2.066685438156128, 52.330257415771484, -83.39476013183594, -2.0670700073242188, 52.330257415771484, -83.39476013183594, -2.0670700073242188, 52.330257415771484, -83.39476013183594, -2.0670700073242188, 52.330257415771484, -83.39476013183594, -2.0670700073242188, 82.60507202148438, 0, -53.60797119140625, 82.60507202148438, 0, -53.60797119140625, 82.60507202148438, 0, -53.60797119140625, 82.60507202148438, 0, -53.60797119140625, 52.33027648925781, -83.39476013183594, 2.066685438156128, 52.33027648925781, -83.39476013183594, 2.066685438156128, 52.33027648925781, -83.39476013183594, 2.066685438156128, 52.33027648925781, -83.39476013183594, 2.066685438156128, -50.26338577270508, -84.67214965820312, 1.2775861024856567, -50.26338577270508, -84.67214965820312, 1.2775861024856567, -50.26338577270508, -84.67214965820312, 1.2775861024856567, -50.26338577270508, -84.67214965820312, 1.2775861024856567, 1.2770904302597046, -50.263389587402344, -84.67215728759766, 1.2770904302597046, -50.263389587402344, -84.67215728759766, 1.2770904302597046, -50.263389587402344, -84.67215728759766, 1.2770904302597046, -50.263389587402344, -84.67215728759766, 2.0665714740753174, -52.330265045166016, -83.39476776123047, 2.0665714740753174, -52.330265045166016, -83.39476776123047, 2.0665714740753174, -52.330265045166016, -83.39476776123047, 2.0665714740753174, -52.330265045166016, -83.39476776123047, -0.0003034261171706021, -53.607669830322266, -82.60527038574219, -0.0003034261171706021, -53.607669830322266, -82.60527038574219, -0.0003034261171706021, -53.607669830322266, -82.60527038574219, -0.0003034261171706021, -53.607669830322266, -82.60527038574219, -1.2777124643325806, 50.263389587402344, -84.6721420288086, -1.2777124643325806, 50.263389587402344, -84.6721420288086, -1.2777124643325806, 50.263389587402344, -84.6721420288086, -1.2777124643325806, 50.263389587402344, -84.6721420288086, 0.0003034261171706021, -53.607669830322266, 82.60527038574219, 0.0003034261171706021, -53.607669830322266, 82.60527038574219, 0.0003034261171706021, -53.607669830322266, 82.60527038574219, 0.0003034261171706021, -53.607669830322266, 82.60527038574219, 1.2777124643325806, 50.263389587402344, 84.6721420288086, 1.2777124643325806, 50.263389587402344, 84.6721420288086, 1.2777124643325806, 50.263389587402344, 84.6721420288086, 1.2777124643325806, 50.263389587402344, 84.6721420288086, 0.0003034261171706021, 53.607669830322266, 82.60527038574219, 0.0003034261171706021, 53.607669830322266, 82.60527038574219, 0.0003034261171706021, 53.607669830322266, 82.60527038574219, 0.0003034261171706021, 53.607669830322266, 82.60527038574219],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-0.5902835130691528, 0.5619468092918396, 0.5794662833213806, -0.5902835130691528, 0.5619468092918396, 0.5794662833213806, -0.5902835130691528, 0.5619468092918396, 0.5794662833213806, -0.5902835130691528, 0.5619468092918396, 0.5794662833213806, -0.9267594814300537, 0.3756551742553711, -3.650784492492676e-7, -0.9267594814300537, 0.3756551742553711, -3.650784492492676e-7, -0.9267594814300537, 0.3756551742553711, -3.650784492492676e-7, -0.9267594814300537, 0.3756551742553711, -3.650784492492676e-7, -0.9375927448272705, 0.3472937345504761, -0.01751660369336605, -0.9375927448272705, 0.3472937345504761, -0.01751660369336605, -0.9375927448272705, 0.3472937345504761, -0.01751660369336605, -0.9375927448272705, 0.3472937345504761, -0.01751660369336605, -0.9375886917114258, -0.34730517864227295, -0.01751125603914261, -0.9375886917114258, -0.34730517864227295, -0.01751125603914261, -0.9375886917114258, -0.34730517864227295, -0.01751125603914261, -0.9375886917114258, -0.34730517864227295, -0.01751125603914261, -0.5794563889503479, -0.5902886986732483, 0.5619516968727112, -0.5794563889503479, -0.5902886986732483, 0.5619516968727112, -0.5794563889503479, -0.5902886986732483, 0.5619516968727112, -0.5794563889503479, -0.5902886986732483, 0.5619516968727112, -0.34728965163230896, -0.01751914620399475, 0.9375942349433899, -0.34728965163230896, -0.01751914620399475, 0.9375942349433899, -0.34728965163230896, -0.01751914620399475, 0.9375942349433899, -0.34728965163230896, -0.01751914620399475, 0.9375942349433899, -0.579460859298706, 0.5902918577194214, -0.5619436502456665, -0.579460859298706, 0.5902918577194214, -0.5619436502456665, -0.579460859298706, 0.5902918577194214, -0.5619436502456665, -0.579460859298706, 0.5902918577194214, -0.5619436502456665, -0.017521724104881287, 0.9375901818275452, 0.34730058908462524, -0.017521724104881287, 0.9375901818275452, 0.34730058908462524, -0.017521724104881287, 0.9375901818275452, 0.34730058908462524, -0.017521724104881287, 0.9375901818275452, 0.34730058908462524, 0.3473122715950012, -0.017512619495391846, 0.9375860095024109, 0.3473122715950012, -0.017512619495391846, 0.9375860095024109, 0.3473122715950012, -0.017512619495391846, 0.9375860095024109, 0.3473122715950012, -0.017512619495391846, 0.9375860095024109, -0.5619495511054993, -0.579465389251709, -0.5902817845344543, -0.5619495511054993, -0.579465389251709, -0.5902817845344543, -0.5619495511054993, -0.579465389251709, -0.5902817845344543, -0.5619495511054993, -0.579465389251709, -0.5902817845344543, 0.5902835130691528, 0.5619468092918396, -0.5794662833213806, 0.5902835130691528, 0.5619468092918396, -0.5794662833213806, 0.5902835130691528, 0.5619468092918396, -0.5794662833213806, 0.5902835130691528, 0.5619468092918396, -0.5794662833213806, 0.9375926852226257, 0.3472939133644104, 0.017516572028398514, 0.9375926852226257, 0.3472939133644104, 0.017516572028398514, 0.9375926852226257, 0.3472939133644104, 0.017516572028398514, 0.9375926852226257, 0.3472939133644104, 0.017516572028398514, 0.9267594814300537, -0.3756551742553711, -0.000007398426532745361, 0.9267594814300537, -0.3756551742553711, -0.000007398426532745361, 0.9267594814300537, -0.3756551742553711, -0.000007398426532745361, 0.9267594814300537, -0.3756551742553711, -0.000007398426532745361, 0.590289294719696, -0.5619460344314575, -0.5794610977172852, 0.590289294719696, -0.5619460344314575, -0.5794610977172852, 0.590289294719696, -0.5619460344314575, -0.5794610977172852, 0.590289294719696, -0.5619460344314575, -0.5794610977172852, 0.3473011553287506, 0.017513729631900787, -0.9375900626182556, 0.3473011553287506, 0.017513729631900787, -0.9375900626182556, 0.3473011553287506, 0.017513729631900787, -0.9375900626182556, 0.3473011553287506, 0.017513729631900787, -0.9375900626182556, 0.01752115786075592, 0.9375901818275452, -0.3473004698753357, 0.01752115786075592, 0.9375901818275452, -0.3473004698753357, 0.01752115786075592, 0.9375901818275452, -0.3473004698753357, 0.01752115786075592, 0.9375901818275452, -0.3473004698753357, 0.5902906656265259, -0.5619435906410217, 0.5794621706008911, 0.5902906656265259, -0.5619435906410217, 0.5794621706008911, 0.5902906656265259, -0.5619435906410217, 0.5794621706008911, 0.5902906656265259, -0.5619435906410217, 0.5794621706008911, -0.01751122623682022, -0.9375880360603333, -0.34730690717697144, -0.01751122623682022, -0.9375880360603333, -0.34730690717697144, -0.01751122623682022, -0.9375880360603333, -0.34730690717697144, -0.01751122623682022, -0.9375880360603333, -0.34730690717697144, -0.34731000661849976, -0.01751551777124405, -0.9375866651535034, -0.34731000661849976, -0.01751551777124405, -0.9375866651535034, -0.34731000661849976, -0.01751551777124405, -0.9375866651535034, -0.34731000661849976, -0.01751551777124405, -0.9375866651535034, -0.5794625282287598, 0.5902847647666931, 0.5619492530822754, -0.5794625282287598, 0.5902847647666931, 0.5619492530822754, -0.5794625282287598, 0.5902847647666931, 0.5619492530822754, -0.5794625282287598, 0.5902847647666931, 0.5619492530822754, -0.3756488859653473, -0.000004090368747711182, 0.9267621040344238, -0.3756488859653473, -0.000004090368747711182, 0.9267621040344238, -0.3756488859653473, -0.000004090368747711182, 0.9267621040344238, -0.3756488859653473, -0.000004090368747711182, 0.9267621040344238, -0.5619439482688904, 0.5794651508331299, 0.5902872681617737, -0.5619439482688904, 0.5794651508331299, 0.5902872681617737, -0.5619439482688904, 0.5794651508331299, 0.5902872681617737, -0.5619439482688904, 0.5794651508331299, 0.5902872681617737, -0.9375901818275452, -0.34730082750320435, 0.017511630430817604, -0.9375901818275452, -0.34730082750320435, 0.017511630430817604, -0.9375901818275452, -0.34730082750320435, 0.017511630430817604, -0.9375901818275452, -0.34730082750320435, 0.017511630430817604, -0.9375885128974915, 0.3473053276538849, 0.017515607178211212, -0.9375885128974915, 0.3473053276538849, 0.017515607178211212, -0.9375885128974915, 0.3473053276538849, 0.017515607178211212, -0.9375885128974915, 0.3473053276538849, 0.017515607178211212, -0.9267594814300537, -0.3756551742553711, 0.000007398426532745361, -0.9267594814300537, -0.3756551742553711, 0.000007398426532745361, -0.9267594814300537, -0.3756551742553711, 0.000007398426532745361, -0.9267594814300537, -0.3756551742553711, 0.000007398426532745361, -0.590289294719696, -0.5619460344314575, 0.5794610977172852, -0.590289294719696, -0.5619460344314575, 0.5794610977172852, -0.590289294719696, -0.5619460344314575, 0.5794610977172852, -0.590289294719696, -0.5619460344314575, 0.5794610977172852, -0.5794673562049866, -0.5902878642082214, -0.5619411468505859, -0.5794673562049866, -0.5902878642082214, -0.5619411468505859, -0.5794673562049866, -0.5902878642082214, -0.5619411468505859, -0.5794673562049866, -0.5902878642082214, -0.5619411468505859, -0.56194669008255, -0.5794578194618225, 0.5902919173240662, -0.56194669008255, -0.5794578194618225, 0.5902919173240662, -0.56194669008255, -0.5794578194618225, 0.5902919173240662, -0.56194669008255, -0.5794578194618225, 0.5902919173240662, -0.3473033905029297, 0.01751108467578888, 0.9375893473625183, -0.3473033905029297, 0.01751108467578888, 0.9375893473625183, -0.3473033905029297, 0.01751108467578888, 0.9375893473625183, -0.3473033905029297, 0.01751108467578888, 0.9375893473625183, -0.000006303191184997559, 0.9267597794532776, -0.3756546974182129, -0.000006303191184997559, 0.9267597794532776, -0.3756546974182129, -0.000006303191184997559, 0.9267597794532776, -0.3756546974182129, -0.000006303191184997559, 0.9267597794532776, -0.3756546974182129, -0.5619495511054993, 0.5794599056243896, -0.5902870297431946, -0.5619495511054993, 0.5794599056243896, -0.5902870297431946, -0.5619495511054993, 0.5794599056243896, -0.5902870297431946, -0.5619495511054993, 0.5794599056243896, -0.5902870297431946, -0.590303897857666, 0.5619341731071472, -0.5794578194618225, -0.590303897857666, 0.5619341731071472, -0.5794578194618225, -0.590303897857666, 0.5619341731071472, -0.5794578194618225, -0.590303897857666, 0.5619341731071472, -0.5794578194618225, 0.017507383599877357, 0.9375904202461243, 0.34730064868927, 0.017507383599877357, 0.9375904202461243, 0.34730064868927, 0.017507383599877357, 0.9375904202461243, 0.34730064868927, 0.017507383599877357, 0.9375904202461243, 0.34730064868927, -0.017507383599877357, 0.9375904202461243, -0.3473004698753357, -0.017507383599877357, 0.9375904202461243, -0.3473004698753357, -0.017507383599877357, 0.9375904202461243, -0.3473004698753357, -0.017507383599877357, 0.9375904202461243, -0.3473004698753357, 0.5619532465934753, 0.5794590711593628, 0.5902844667434692, 0.5619532465934753, 0.5794590711593628, 0.5902844667434692, 0.5619532465934753, 0.5794590711593628, 0.5902844667434692, 0.5619532465934753, 0.5794590711593628, 0.5902844667434692, 0.3756416141986847, 0.0000029206275939941406, 0.926764965057373, 0.3756416141986847, 0.0000029206275939941406, 0.926764965057373, 0.3756416141986847, 0.0000029206275939941406, 0.926764965057373, 0.3756416141986847, 0.0000029206275939941406, 0.926764965057373, 0.5902771949768066, 0.5619665384292603, 0.5794534683227539, 0.5902771949768066, 0.5619665384292603, 0.5794534683227539, 0.5902771949768066, 0.5619665384292603, 0.5794534683227539, 0.5902771949768066, 0.5619665384292603, 0.5794534683227539, 0.017511233687400818, -0.937588095664978, 0.3473067581653595, 0.017511233687400818, -0.937588095664978, 0.3473067581653595, 0.017511233687400818, -0.937588095664978, 0.3473067581653595, 0.017511233687400818, -0.937588095664978, 0.3473067581653595, 0.5619463324546814, -0.579465389251709, 0.5902849435806274, 0.5619463324546814, -0.579465389251709, 0.5902849435806274, 0.5619463324546814, -0.579465389251709, 0.5902849435806274, 0.5619463324546814, -0.579465389251709, 0.5902849435806274, 0.017518242821097374, -0.9375925660133362, -0.34729424118995667, 0.017518242821097374, -0.9375925660133362, -0.34729424118995667, 0.017518242821097374, -0.9375925660133362, -0.34729424118995667, 0.017518242821097374, -0.9375925660133362, -0.34729424118995667, -0.5902858376502991, -0.5619493722915649, -0.5794615745544434, -0.5902858376502991, -0.5619493722915649, -0.5794615745544434, -0.5902858376502991, -0.5619493722915649, -0.5794615745544434, -0.5902858376502991, -0.5619493722915649, -0.5794615745544434, -0.37564951181411743, 0.0000028908252716064453, -0.9267617464065552, -0.37564951181411743, 0.0000028908252716064453, -0.9267617464065552, -0.37564951181411743, 0.0000028908252716064453, -0.9267617464065552, -0.37564951181411743, 0.0000028908252716064453, -0.9267617464065552, 0.5794623494148254, 0.5902848839759827, -0.5619493126869202, 0.5794623494148254, 0.5902848839759827, -0.5619493126869202, 0.5794623494148254, 0.5902848839759827, -0.5619493126869202, 0.5794623494148254, 0.5902848839759827, -0.5619493126869202, 0.9267598390579224, 0.3756541609764099, 2.980232238769531e-7, 0.9267598390579224, 0.3756541609764099, 2.980232238769531e-7, 0.9267598390579224, 0.3756541609764099, 2.980232238769531e-7, 0.9267598390579224, 0.3756541609764099, 2.980232238769531e-7, 0.5619441866874695, 0.5794647932052612, -0.5902873873710632, 0.5619441866874695, 0.5794647932052612, -0.5902873873710632, 0.5619441866874695, 0.5794647932052612, -0.5902873873710632, 0.5619441866874695, 0.5794647932052612, -0.5902873873710632, 0.9375880360603333, -0.347307026386261, 0.017507091164588928, 0.9375880360603333, -0.347307026386261, 0.017507091164588928, 0.9375880360603333, -0.347307026386261, 0.017507091164588928, 0.9375880360603333, -0.347307026386261, 0.017507091164588928, 0.9375901818275452, -0.34730082750320435, -0.017511630430817604, 0.9375901818275452, -0.34730082750320435, -0.017511630430817604, 0.9375901818275452, -0.34730082750320435, -0.017511630430817604, 0.9375901818275452, -0.34730082750320435, -0.017511630430817604, 0.9375885128974915, 0.3473053276538849, -0.017515607178211212, 0.9375885128974915, 0.3473053276538849, -0.017515607178211212, 0.9375885128974915, 0.3473053276538849, -0.017515607178211212, 0.9375885128974915, 0.3473053276538849, -0.017515607178211212, 0.5794609785079956, 0.5902916789054871, 0.5619437098503113, 0.5794609785079956, 0.5902916789054871, 0.5619437098503113, 0.5794609785079956, 0.5902916789054871, 0.5619437098503113, 0.5794609785079956, 0.5902916789054871, 0.5619437098503113, 0.5794563889503479, -0.5902886986732483, -0.5619516968727112, 0.5794563889503479, -0.5902886986732483, -0.5619516968727112, 0.5794563889503479, -0.5902886986732483, -0.5619516968727112, 0.5794563889503479, -0.5902886986732483, -0.5619516968727112, 0.3756488859653473, -0.000004090368747711182, -0.9267621040344238, 0.3756488859653473, -0.000004090368747711182, -0.9267621040344238, 0.3756488859653473, -0.000004090368747711182, -0.9267621040344238, 0.3756488859653473, -0.000004090368747711182, -0.9267621040344238, 0.5794673562049866, -0.5902878642082214, 0.5619410276412964, 0.5794673562049866, -0.5902878642082214, 0.5619410276412964, 0.5794673562049866, -0.5902878642082214, 0.5619410276412964, 0.5794673562049866, -0.5902878642082214, 0.5619410276412964, -0.017518242821097374, -0.9375925660133362, 0.34729424118995667, -0.017518242821097374, -0.9375925660133362, 0.34729424118995667, -0.017518242821097374, -0.9375925660133362, 0.34729424118995667, -0.017518242821097374, -0.9375925660133362, 0.34729424118995667, 0.34729689359664917, -0.017507314682006836, -0.9375919103622437, 0.34729689359664917, -0.017507314682006836, -0.9375919103622437, 0.34729689359664917, -0.017507314682006836, -0.9375919103622437, 0.34729689359664917, -0.017507314682006836, -0.9375919103622437, 0.5619431734085083, -0.5794587135314941, -0.5902944207191467, 0.5619431734085083, -0.5794587135314941, -0.5902944207191467, 0.5619431734085083, -0.5794587135314941, -0.5902944207191467, 0.5619431734085083, -0.5794587135314941, -0.5902944207191467, 0.0000016316771507263184, -0.9267597794532776, -0.3756546974182129, 0.0000016316771507263184, -0.9267597794532776, -0.3756546974182129, 0.0000016316771507263184, -0.9267597794532776, -0.3756546974182129, 0.0000016316771507263184, -0.9267597794532776, -0.3756546974182129, -0.3473055958747864, 0.017509743571281433, -0.9375884532928467, -0.3473055958747864, 0.017509743571281433, -0.9375884532928467, -0.3473055958747864, 0.017509743571281433, -0.9375884532928467, -0.3473055958747864, 0.017509743571281433, -0.9375884532928467, -0.0000012889504432678223, -0.9267591834068298, 0.3756559193134308, -0.0000012889504432678223, -0.9267591834068298, 0.3756559193134308, -0.0000012889504432678223, -0.9267591834068298, 0.3756559193134308, -0.0000012889504432678223, -0.9267591834068298, 0.3756559193134308, 0.3473014235496521, 0.01751813292503357, 0.9375898241996765, 0.3473014235496521, 0.01751813292503357, 0.9375898241996765, 0.3473014235496521, 0.01751813292503357, 0.9375898241996765, 0.3473014235496521, 0.01751813292503357, 0.9375898241996765, 0.000006429851055145264, 0.9267741441726685, 0.37561920285224915, 0.000006429851055145264, 0.9267741441726685, 0.37561920285224915, 0.000006429851055145264, 0.9267741441726685, 0.37561920285224915, 0.000006429851055145264, 0.9267741441726685, 0.37561920285224915],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.050937071442604065, 0.0637897253036499, 0.11147573590278625, 0.05759662389755249, 0.1211576759815216, 0.10764795541763306, 0.12535500526428223, 0.35762202739715576, 0.05231131985783577, 0.1178632378578186, 0.07363925129175186, 0.11786329746246338, 0.119850754737854, 0.015513718128204346, 0.6247040033340454, 0.2332320213317871, 0.02066764421761036, 0.05759531259536743, 0.07363908737897873, 0.06378960609436035, 0.1211576759815216, 0.005298316478729248, 0.5624589920043945, 0.1254199743270874, 0.0220418032258749, 0.05759531259536743, 0.08258064091205597, 0.0637897253036499, 0.1211576759815216, 0.0066724419593811035, 0.24976900219917297, 0.6079350113868713, 0.02066793106496334, 0.11786329746246338, 0.02823532558977604, 0.06378841400146484, 0.1211576759815216, 0.09218895435333252, 0.4997659921646118, 0.1081160306930542, 0.08120644837617874, 0.057596445083618164, 0.0977153331041336, 0.11786329746246338, 0.1190430074930191, 0.039651691913604736, 0.4997679889202118, 0.3578059673309326, 0.05987865850329399, 0.0035230517387390137, 0.07501331716775894, 0.11786329746246338, 0.1190430074930191, 0.014401912689208984, 0.3747130036354065, 0.48311901092529297, 0.037176623940467834, 0.06378841400146484, 0.08877374976873398, 0.0637897253036499, 0.1211576759815216, 0.013714849948883057, 0.3754439949989319, 0.48308396339416504, 0.01310031395405531, 0.057595252990722656, 0.08258060365915298, 0.05759638547897339, 0.119850754737854, 0.038539886474609375, 0.24988000094890594, 0.4829980134963989, 0.04336973652243614, 0.003524184226989746, 0.06254100054502487, 0.37501800060272217, 0.08877380937337875, 0.05759662389755249, 0.11985072493553162, 0.04695647954940796, 0.00035799999022856355, 0.6079339981079102, 0.02823505364358425, 0.05759531259536743, 0.096341073513031, 0.0035229921340942383, 0.1190430074930191, 0.02281850576400757, 0.06744597852230072, 0.05759650468826294, 0.07363912463188171, 0.05759662389755249, 0.121157705783844, 0.0557977557182312, 0.3125090003013611, 0.0000960230827331543, 0.0055332062765955925, 0.11786329746246338, 0.10390840470790863, 0.0637897253036499, 0.11985082179307938, 0.09880667924880981, 0.5625389814376831, 0.25025200843811035, 0.0069072050973773, 0.06378835439682007, 0.05093708261847496, 0.0035218000411987305, 0.1211576759815216, 0.02213144302368164, 0.2504560053348541, 0.3578009605407715, 0.0296091977506876, 0.0035229921340942383, 0.06246799975633621, 0.25025999546051025, 0.10390840470790863, 0.0035241246223449707, 0.1211576759815216, 0.0823981761932373, 0.044743988662958145, 0.06378841400146484, 0.09014798700809479, 0.11786329746246338, 0.1211576759815216, 0.11606442928314209, 0.5002009868621826, 0.10809803009033203, 0.014474472962319851, 0.003522932529449463, 0.10528266429901123, 0.1178632378578186, 0.119850754737854, 0.05759662389755249, 0.24995200335979462, 0.2328779697418213, 0.006907171569764614, 0.057595252990722656, 0.062495000660419464, 0.12494999170303345, 0.0901479572057724, 0.0035241246223449707, 0.11904306709766388, 0.09150189161300659, 0.04474392160773277, 0.003524184226989746, 0.10528260469436646, 0.05759662389755249, 0.1190430074930191, 0.048068225383758545, 0.37474000453948975, 0.23276197910308838, 0.03580237179994583, 0.06378841400146484, 0.05093725398182869, 0.11786329746246338, 0.1211576759815216, 0.015089035034179688, 0.1876010000705719, 0.24980902671813965, 0.09771531820297241, 0.0637897253036499, 0.1128498986363411, 0.05759662389755249, 0.1211576759815216, 0.10902208089828491, 0.37527701258659363, 0.3578059673309326, 0.03580237179994583, 0.11786329746246338, 0.11147570610046387, 0.003524184226989746, 0.119850754737854, 0.030123412609100342, 0.24984599649906158, 0.35762202739715576, 0.02204183302819729, 0.0035229921340942383, 0.029609275981783867, 0.11786329746246338, 0.11904306709766388, 0.10833495855331421, 0.12527799606323242, 0.6079350113868713, 0.02066764421761036, 0.0035229921340942383, 0.05231131985783577, 0.0637897253036499, 0.11985082179307938, 0.1072232723236084, 0.5002130270004272, 0.2332320213317871, 0.029609275981783867, 0.06378841400146484, 0.08258064091205597, 0.11786329746246338, 0.1211576759815216, 0.09081476926803589, 0.1875240057706833, 0.5001220107078552, 0.028234990313649178, 0.11786329746246338, 0.096341073513031, 0.0637897253036499, 0.11985072493553162, 0.1094467043876648, 0.37527498602867126, 0.1081160306930542, 0.00029600001289509237, 0.4828310012817383, 0.08120640367269516, 0.11786329746246338, 0.08877374976873398, 0.0035241246223449707, 0.11985082179307938, 0.09039008617401123, 0.02066764421761036, 0.06378841400146484, 0.09634126722812653, 0.11786329746246338, 0.119850754737854, 0.04076343774795532, 0.43751999735832214, 0.00030297040939331055, 0.08120640367269516, 0.0035240650177001953, 0.1128498986363411, 0.003524184226989746, 0.1190430074930191, 0.031235098838806152, 0.4375219941139221, 0.2499929666519165, 0.04474368318915367, 0.11786329746246338, 0.05850442126393318, 0.05759662389755249, 0.119850754737854, 0.0841970443725586, 0.6246920228004456, 0.10809803009033203, 0.059878647327423096, 0.05759662389755249, 0.06607192009687424, 0.11786329746246338, 0.11904306709766388, 0.08308535814285278, 0.3124679923057556, 0.37530601024627686, 0.06607174873352051, 0.0637897253036499, 0.07501332461833954, 0.06378960609436035, 0.119850754737854, 0.00487363338470459, 0.25022199749946594, 0.48311901092529297, 0.05987865850329399, 0.11786329746246338, 0.0887739360332489, 0.11786329746246338, 0.119850754737854, 0.11563986539840698, 0.43768998980522156, 0.3752709627151489, 0.05850460007786751, 0.0035230517387390137, 0.09014798700809479, 0.0637897253036499, 0.11985069513320923, 0.013290226459503174, 0.5624470114707947, 0.00028502941131591797, 0.05850442126393318, 0.06378966569900513, 0.11147573590278625, 0.11786329746246338, 0.1211576759815216, 0.031922221183776855, 0.43765100836753845, 0.12517499923706055, 0.013100284151732922, 0.003522932529449463, 0.11284996569156647, 0.0637897253036499, 0.1190430074930191, 0.056484758853912354, 0.18763400614261627, 0.3751859664916992, 0.06607174873352051, 0.05759650468826294, 0.11147589981555939, 0.0637897253036499, 0.119850754737854, 0.05537313222885132, 0.3754050135612488, 0.23298698663711548, 0.005532982759177685, 0.0035241246223449707, 0.037176575511693954, 0.0035229921340942383, 0.119850754737854, 0.10103017091751099, 0.5628489851951599, 0.37501800060272217, 0.014474472962319851, 0.057595252990722656, 0.03580237179994583, 0.05759531259536743, 0.1211576759815216, 0.03896456956863403, 0.18770700693130493, 0.12506598234176636, 0.006907171569764614, 0.0035241246223449707, 0.014474536292254925, 0.11786329746246338, 0.1211576759815216, 0.10060548782348633, 0.12473999708890915, 0.23276197910308838, 0.04336966946721077, 0.05759531259536743, 0.08120658993721008, 0.0637897253036499, 0.119850754737854, 0.007097125053405762, 0.12478700280189514, 0.4828310012817383, 0.04474392160773277, 0.05759531259536743, 0.06744600087404251, 0.0637897253036499, 0.1190430074930191, 0.005985379219055176, 0.31249499320983887, 0.12494999170303345, 0.04336971789598465, 0.06378841400146484, 0.06260299682617188, 0.500120997428894, 0.09634125232696533, 0.05759662389755249, 0.1211576759815216, 0.11743861436843872, 0.06744597852230072, 0.003522932529449463, 0.09771530330181122, 0.05759662389755249, 0.11985082179307938, 0.11786329746246338, 0.37475401163101196, 0.10790902376174927, 0.02823500521481037, 0.0035229921340942383, 0.04336973652243614, 0.11786329746246338, 0.1211576759815216, 0.08377236127853394, 0.12484899908304214, 0.6079339981079102, 0.07501329481601715, 0.05759662389755249, 0.10390856862068176, 0.11786329746246338, 0.121157705783844, 0.05717200040817261, 0.624783992767334, 0.35806500911712646, 0.005532919429242611, 0.06378835439682007, 0.07501330226659775, 0.0035242438316345215, 0.1211576759815216, 0.02350562810897827, 0.5002930164337158, 0.35806500911712646, 0.07363908737897873, 0.0035242438316345215, 0.09771530330181122, 0.0035229921340942383, 0.119850754737854, 0.02393031120300293, 0.2502630054950714, 0.10790902376174927, 0.05850442126393318, 0.11786329746246338, 0.06607190519571304, 0.003522932529449463, 0.11904306709766388, 0.11675161123275757, 0.49989598989486694, 0.23298698663711548, 0.0069072050973773, 0.11786329746246338, 0.01310060080140829, 0.11786329746246338, 0.1211576759815216, 0.09923136234283447, 0.3749470114707947, 0.3578009605407715, 0.00022200000239536166, 0.35807204246520996, 0.0296091977506876, 0.05759531259536743, 0.052311308681964874, 0.0035218000411987305, 0.119850754737854, 0.021706759929656982, 0.035802435129880905, 0.0035229921340942383, 0.10528266429901123, 0.06378966569900513, 0.11904306709766388, 0.0999184250831604, 0.12546099722385406, 0.2328779697418213, 0.005532919429242611, 0.057595252990722656, 0.02204192988574505, 0.11786329746246338, 0.11985082179307938, 0.09261363744735718, 0.625095009803772, 0.4828310012817383, 0.05231131985783577, 0.05759531259536743, 0.10390844196081161, 0.05759662389755249, 0.11985072493553162, 0.049180030822753906, 0.1247130036354065, 0.35807204246520996, 0.013100284151732922, 0.06378841400146484, 0.050937261432409286, 0.05759531259536743, 0.1211576759815216, 0.04875540733337402, 0.3127020001411438, 0.24998903274536133, 0.00024900000425986946, 0.23276197910308838, 0.014474536292254925, 0.06378841400146484, 0.0901479572057724, 0.05759662389755249, 0.1211576759815216, 0.04738116264343262, 0.06744600087404251, 0.11786329746246338, 0.10528260469436646, 0.0035241246223449707, 0.11985082179307938, 0.0819736123085022, 0.2502489984035492, 0.23276197910308838, 0.022041896358132362, 0.06378841400146484, 0.037176575511693954, 0.05759531259536743, 0.1211576759815216, 0.040338754653930664, 0.500603973865509, 0.4828310012817383, 0.08258060365915298, 0.00352400541305542, 0.11284996569156647, 0.11786329746246338, 0.119850754737854, 0.03234678506851196, 0.1253889948129654, 0.4829980134963989, 0.03717633709311485, 0.11786329746246338, 0.05987846478819847, 0.06378966569900513, 0.1211576759815216, 0.03054797649383545, 0.4999360144138336, 0.48308396339416504],\n \"normalized\": false\n },\n \"color\": {\n \"itemSize\": 4,\n \"type\": \"Uint16Array\",\n \"array\": [65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535],\n \"normalized\": true\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [3, 87, 79, 95, 7, 11, 91, 15, 99, 103, 19, 111, 83, 23, 115, 127, 27, 123, 31, 239, 131, 235, 35, 143, 231, 211, 151, 104, 163, 37, 40, 179, 169, 191, 175, 47, 187, 183, 51, 55, 199, 219, 200, 215, 57, 63, 119, 135, 147, 195, 139, 207, 67, 155, 220, 159, 69, 227, 75, 167, 42, 173, 189, 176, 201, 56, 168, 116, 60, 58, 73, 225, 144, 172, 193, 36, 164, 72, 49, 65, 205, 106, 222, 70, 221, 197, 157, 92, 12, 88, 233, 145, 137, 54, 43, 190, 148, 68, 156, 140, 152, 64, 52, 48, 196, 117, 24, 132, 228, 16, 209, 229, 204, 153, 125, 5, 25, 124, 224, 165, 202, 217, 212, 192, 237, 136, 0, 4, 93, 133, 129, 61, 85, 81, 113, 100, 96, 17, 76, 236, 28, 80, 109, 21, 97, 161, 105, 188, 180, 185, 26, 78, 30, 10, 126, 166, 206, 158, 198, 86, 114, 234, 110, 230, 154, 62, 130, 194, 59, 226, 122, 107, 210, 18, 74, 214, 218, 102, 2, 94, 112, 33, 232, 66, 46, 146, 42, 170, 173, 176, 41, 201, 168, 177, 116, 58, 213, 73, 144, 44, 172, 36, 160, 164, 49, 181, 65, 106, 38, 222, 221, 216, 197, 92, 8, 12, 233, 141, 145, 190, 186, 54, 54, 203, 43, 148, 208, 68, 140, 32, 152, 52, 184, 48, 117, 120, 24, 228, 108, 16, 229, 149, 204, 125, 9, 5, 124, 121, 224, 202, 53, 217, 192, 128, 237, 0, 77, 4, 133, 29, 129, 85, 1, 81, 100, 89, 96, 76, 84, 236, 80, 101, 109, 97, 13, 161, 188, 45, 180, 30, 134, 26, 26, 6, 78, 166, 162, 14, 14, 10, 166, 198, 50, 206, 206, 150, 158, 234, 138, 238, 238, 86, 234, 154, 34, 22, 22, 110, 154, 174, 171, 194, 171, 62, 194, 118, 178, 122, 178, 59, 122, 18, 98, 107, 107, 71, 210, 223, 39, 218, 39, 74, 218, 94, 90, 102, 102, 82, 2, 112, 20, 33, 146, 142, 66, 66, 182, 46]\n },\n \"boundingSphere\": {\n \"center\": [0, 0, 0],\n \"radius\": 146.65657531498138\n }\n },\n faceValues: [10, 17, 3, 16, 8, 7, 12, 20, 6, 19, 5, 18, 4, 11, 13, 15, 2, 14, 9, 1],\n rotationCombinations: {\n \"1,2\": [-58, 18, 148],\n \"1,3\": [-21, -30, -69],\n \"1,4\": [-159, -30, 69],\n \"1,5\": [-122, 18, 32],\n \"1,6\": [58, -54, -148],\n \"1,7\": [-58, 18, -31],\n \"1,8\": [180, 0, 180],\n \"1,9\": [58, -54, 30],\n \"1,10\": [122, 54, -148],\n \"1,11\": [-122, -54, 31],\n \"1,12\": [-58, 54, -148],\n \"1,13\": [58, 18, 31],\n \"1,14\": [58, -18, 148],\n \"1,15\": [148, 90, -58],\n \"1,16\": [122, -18, -148],\n \"1,17\": [159, 30, -110],\n \"1,18\": [21, 30, 110],\n \"1,19\": [158, -30, -69],\n \"1,20\": [0, 0, 180],\n \"2,3\": [-159, -30, 68],\n \"2,4\": [-159, -30, -110],\n \"2,5\": [122, -54, 148],\n \"2,6\": [-122, 54, 148],\n \"2,7\": [-32, -90, -122],\n \"2,8\": [-20, 30, 69],\n \"2,9\": [-122, 54, -32],\n \"2,10\": [58, 18, 30],\n \"2,11\": [-180, 90, 90],\n \"2,12\": [21, -30, 69],\n \"2,13\": [-21, 30, -110],\n \"2,14\": [158, 30, -110],\n \"2,15\": [21, -30, -110],\n \"2,16\": [0, 90, 90],\n \"2,17\": [-58, -54, 148],\n \"2,18\": [-58, -54, -32],\n \"2,19\": [158, 30, 69],\n \"2,20\": [58, 54, -30],\n \"3,4\": [0, 0, 180],\n \"3,5\": [-158, 30, -69],\n \"3,6\": [90, 0, 90],\n \"3,7\": [-159, -30, -110],\n \"3,8\": [158, -30, 110],\n \"3,9\": [90, 0, -90],\n \"3,10\": [-58, 18, -32],\n \"3,11\": [58, -54, -148],\n \"3,12\": [-90, 0, -90],\n \"3,13\": [-21, -30, 110],\n \"3,14\": [21, -30, -110],\n \"3,15\": [-90, 0, 90],\n \"3,16\": [58, -54, 30],\n \"3,17\": [-180, 0, 180],\n \"3,18\": [180, 0, 0],\n \"3,19\": [58, 54, -32],\n \"3,20\": [158, 30, 69],\n \"4,5\": [58, -18, -32],\n \"4,6\": [-58, 18, 148],\n \"4,7\": [158, 30, 69],\n \"4,8\": [-90, -90, 0],\n \"4,9\": [-58, 18, -32],\n \"4,10\": [58, -18, 148],\n \"4,11\": [-122, -18, 148],\n \"4,12\": [122, 18, -32],\n \"4,13\": [0, -90, -90],\n \"4,14\": [-122, 18, -148],\n \"4,15\": [122, 18, 148],\n \"4,16\": [-122, -18, -32],\n \"4,17\": [58, -54, -148],\n \"4,18\": [58, 54, -32],\n \"4,19\": [-58, -54, 148],\n \"4,20\": [-158, -30, -110],\n \"5,6\": [-122, -18, 148],\n \"5,7\": [122, 54, 30],\n \"5,8\": [58, -54, -148],\n \"5,9\": [-122, -54, -148],\n \"5,10\": [0, 0, 180],\n \"5,11\": [-58, -54, -32],\n \"5,12\": [58, 54, -32],\n \"5,13\": [-58, 18, -32],\n \"5,14\": [180, 0, -180],\n \"5,15\": [58, 54, 148],\n \"5,16\": [-58, -54, 148],\n \"5,17\": [122, 18, -32],\n \"5,18\": [-58, 54, 32],\n \"5,19\": [-180, 0, 0],\n \"5,20\": [-122, 54, 148],\n \"6,7\": [-159, 30, 110],\n \"6,8\": [-58, -54, -32],\n \"6,9\": [21, 30, -69],\n \"6,10\": [122, -54, 148],\n \"6,11\": [58, 54, -32],\n \"6,12\": [159, -30, 110],\n \"6,13\": [-122, 54, 148],\n \"6,14\": [-21, -30, -69],\n \"6,15\": [159, -30, -69],\n \"6,16\": [58, 54, 148],\n \"6,17\": [90, -90, -180],\n \"6,18\": [122, 18, -32],\n \"6,19\": [-21, -30, 110],\n \"6,20\": [122, 54, 32],\n \"7,8\": [21, -30, -110],\n \"7,9\": [159, -30, -69],\n \"7,10\": [21, 30, -69],\n \"7,11\": [90, 0, 90],\n \"7,12\": [-58, 54, 32],\n \"7,13\": [122, 54, 32],\n \"7,14\": [58, -54, -148],\n \"7,15\": [-21, 30, 69],\n \"7,16\": [90, 0, -90],\n \"7,17\": [58, 54, -32],\n \"7,18\": [-21, -30, 110],\n \"7,19\": [-159, -30, -110],\n \"7,20\": [-158, 30, 110],\n \"8,9\": [122, 54, -148],\n \"8,10\": [58, -54, 32],\n \"8,11\": [-58, 54, -148],\n \"8,12\": [-122, -54, 32],\n \"8,13\": [0, 0, 180],\n \"8,14\": [122, 18, -32],\n \"8,15\": [0, -90, 90],\n \"8,16\": [-58, 54, 32],\n \"8,17\": [-90, 0, 90],\n \"8,18\": [-90, 0, -90],\n \"8,19\": [-122, 54, 148],\n \"8,20\": [180, 0, 0],\n \"9,10\": [-159, -30, -110],\n \"9,11\": [58, -18, -32],\n \"9,12\": [180, 0, 180],\n \"9,13\": [58, 54, -32],\n \"9,14\": [21, 30, 110],\n \"9,15\": [-180, 0, 0],\n \"9,16\": [-58, -54, -32],\n \"9,17\": [-122, -18, -32],\n \"9,18\": [90, 90, 0],\n \"9,19\": [-58, -18, 32],\n \"9,20\": [-58, 54, -148],\n \"10,11\": [58, 54, 148],\n \"10,12\": [-58, -18, 32],\n \"10,13\": [58, -18, 148],\n \"10,14\": [90, 0, -90],\n \"10,15\": [-58, -54, -32],\n \"10,16\": [120, -18, 32],\n \"10,17\": [-122, -18, 148],\n \"10,18\": [58, -54, -148],\n \"10,19\": [-180, 0, -180],\n \"10,20\": [122, -54, -32],\n \"11,12\": [159, 30, -110],\n \"11,13\": [-159, -30, 69],\n \"11,14\": [21, -30, 69],\n \"11,15\": [122, 18, -32],\n \"11,16\": [0, 0, -180],\n \"11,17\": [159, -30, -69],\n \"11,18\": [58, 18, 32],\n \"11,19\": [-122, -54, 30],\n \"11,20\": [21, 30, 110],\n \"12,13\": [58, 54, 148],\n \"12,14\": [-122, 18, 32],\n \"12,15\": [0, 0, -180],\n \"12,16\": [-122, 54, 148],\n \"12,17\": [-110, -90, 159],\n \"12,18\": [58, 18, -148],\n \"12,19\": [159, -30, 110],\n \"12,20\": [90, 0, -90],\n \"13,14\": [122, -54, 148],\n \"13,15\": [58, 54, -32],\n \"13,16\": [-58, -18, -148],\n \"13,17\": [-21, 30, -110],\n \"13,18\": [-21, 30, 69],\n \"13,19\": [122, -54, -32],\n \"13,20\": [-180, 0, -180],\n \"14,15\": [122, -18, -148],\n \"14,16\": [21, 30, 110],\n \"14,17\": [58, -18, 148],\n \"14,18\": [58, -18, -32],\n \"14,19\": [0, 0, -180],\n \"14,20\": [58, 18, 32],\n \"15,16\": [159, 30, -110],\n \"15,17\": [58, -18, -32],\n \"15,18\": [-58, -18, 32],\n \"15,19\": [122, -18, 32],\n \"15,20\": [58, -54, -148],\n \"16,17\": [122, -54, 148],\n \"16,18\": [122, -54, -32],\n \"16,19\": [122, 54, -148],\n \"16,20\": [-122, 54, -32],\n \"17,18\": [0, 0, 180],\n \"17,19\": [122, -54, 148],\n \"17,20\": [21, -30, -110],\n \"18,19\": [-159, -30, 69],\n \"18,20\": [158, 30, -110],\n \"19,20\": [58, 54, 148]\n }\n },\n \"d24\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"D1B379DE-9640-4151-A394-D6DF1846E49C\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-93.4049072265625,-3.781350612640381,3.7816989421844482,-93.4049072265625,-3.781350612640381,3.7816989421844482,-93.4049072265625,-3.781350612640381,3.7816989421844482,-93.4049072265625,-3.781350612640381,3.7816989421844482,-49.7835578918457,55.42812728881836,-49.783199310302734,-49.7835578918457,55.42812728881836,-49.783199310302734,-49.7835578918457,55.42812728881836,-49.783199310302734,-49.7835578918457,55.42812728881836,-49.783199310302734,-63.36488342285156,68.7131118774414,-3.781550168991089,-63.36488342285156,68.7131118774414,-3.781550168991089,-63.36488342285156,68.7131118774414,-3.781550168991089,-63.36488342285156,68.7131118774414,-3.781550168991089,-3.7813644409179688,93.4049301147461,-3.7813427448272705,-3.7813644409179688,93.4049301147461,-3.7813427448272705,-3.7813644409179688,93.4049301147461,-3.7813427448272705,-3.7813644409179688,93.4049301147461,-3.7813427448272705,3.7820396423339844,63.364871978759766,68.71309661865234,3.7820396423339844,63.364871978759766,68.71309661865234,3.7820396423339844,63.364871978759766,68.71309661865234,3.7820396423339844,63.364871978759766,68.71309661865234,49.78358840942383,49.783382415771484,55.427940368652344,49.78358840942383,49.783382415771484,55.427940368652344,49.78358840942383,49.783382415771484,55.427940368652344,49.78358840942383,49.783382415771484,55.427940368652344,-93.40494537353516,3.7813589572906494,-3.781012773513794,-93.40494537353516,3.7813589572906494,-3.781012773513794,-93.40494537353516,3.7813589572906494,-3.781012773513794,-93.40494537353516,3.7813589572906494,-3.781012773513794,-55.42829895019531,49.78338623046875,-49.78317642211914,-55.42829895019531,49.78338623046875,-49.78317642211914,-55.42829895019531,49.78338623046875,-49.78317642211914,-55.42829895019531,49.78338623046875,-49.78317642211914,-63.3648567199707,68.7131118774414,3.7820181846618652,-63.3648567199707,68.7131118774414,3.7820181846618652,-63.3648567199707,68.7131118774414,3.7820181846618652,-63.3648567199707,68.7131118774414,3.7820181846618652,49.7835693359375,55.42811965942383,49.783199310302734,49.7835693359375,55.42811965942383,49.783199310302734,49.7835693359375,55.42811965942383,49.783199310302734,49.7835693359375,55.42811965942383,49.783199310302734,63.364891052246094,68.7131118774414,3.781550168991089,63.364891052246094,68.7131118774414,3.781550168991089,63.364891052246094,68.7131118774414,3.781550168991089,63.364891052246094,68.7131118774414,3.781550168991089,63.3646240234375,3.781778573989868,-68.71334075927734,63.3646240234375,3.781778573989868,-68.71334075927734,63.3646240234375,3.781778573989868,-68.71334075927734,63.3646240234375,3.781778573989868,-68.71334075927734,68.71309661865234,63.3648681640625,-3.7820355892181396,68.71309661865234,63.3648681640625,-3.7820355892181396,68.71309661865234,63.3648681640625,-3.7820355892181396,68.71309661865234,63.3648681640625,-3.7820355892181396,93.4049072265625,3.781350612640381,-3.7816996574401855,93.4049072265625,3.781350612640381,-3.7816996574401855,93.4049072265625,3.781350612640381,-3.7816996574401855,93.4049072265625,3.781350612640381,-3.7816996574401855,68.71288299560547,3.781782865524292,-63.36511993408203,68.71288299560547,3.781782865524292,-63.36511993408203,68.71288299560547,3.781782865524292,-63.36511993408203,68.71288299560547,3.781782865524292,-63.36511993408203,55.42794418334961,49.783382415771484,-49.7835807800293,55.42794418334961,49.783382415771484,-49.7835807800293,55.42794418334961,49.783382415771484,-49.7835807800293,55.42794418334961,49.783382415771484,-49.7835807800293,49.783203125,55.42811965942383,-49.7835578918457,49.783203125,55.42811965942383,-49.7835578918457,49.783203125,55.42811965942383,-49.7835578918457,49.783203125,55.42811965942383,-49.7835578918457,3.7813453674316406,93.4049301147461,-3.781369686126709,3.7813453674316406,93.4049301147461,-3.781369686126709,3.7813453674316406,93.4049301147461,-3.781369686126709,3.7813453674316406,93.4049301147461,-3.781369686126709,93.40494537353516,-3.7813589572906494,3.7810134887695312,93.40494537353516,-3.7813589572906494,3.7810134887695312,93.40494537353516,-3.7813589572906494,3.7810134887695312,93.40494537353516,-3.7813589572906494,3.7810134887695312,-3.7816996574401855,3.7813563346862793,-93.40489196777344,-3.7816996574401855,3.7813563346862793,-93.40489196777344,-3.7816996574401855,3.7813563346862793,-93.40489196777344,-3.7816996574401855,3.7813563346862793,-93.40489196777344,-49.7835807800293,49.78338623046875,-55.427940368652344,-49.7835807800293,49.78338623046875,-55.427940368652344,-49.7835807800293,49.78338623046875,-55.427940368652344,-49.7835807800293,49.78338623046875,-55.427940368652344,55.428306579589844,49.783382415771484,49.78317642211914,55.428306579589844,49.783382415771484,49.78317642211914,55.428306579589844,49.783382415771484,49.78317642211914,55.428306579589844,49.783382415771484,49.78317642211914,-3.7813727855682373,-93.4049301147461,-3.781342029571533,-3.7813727855682373,-93.4049301147461,-3.781342029571533,-3.7813727855682373,-93.4049301147461,-3.781342029571533,-3.7813727855682373,-93.4049301147461,-3.781342029571533,-68.71334838867188,-3.781782865524292,-63.36461639404297,-68.71334838867188,-3.781782865524292,-63.36461639404297,-68.71334838867188,-3.781782865524292,-63.36461639404297,-68.71334838867188,-3.781782865524292,-63.36461639404297,-3.7820396423339844,-63.364871978759766,-68.71309661865234,-3.7820396423339844,-63.364871978759766,-68.71309661865234,-3.7820396423339844,-63.364871978759766,-68.71309661865234,-3.7820396423339844,-63.364871978759766,-68.71309661865234,-49.7835807800293,-49.783382415771484,-55.427940368652344,-49.7835807800293,-49.783382415771484,-55.427940368652344,-49.7835807800293,-49.783382415771484,-55.427940368652344,-49.7835807800293,-49.783382415771484,-55.427940368652344,63.3648567199707,-68.7131118774414,-3.7820160388946533,63.3648567199707,-68.7131118774414,-3.7820160388946533,63.3648567199707,-68.7131118774414,-3.7820160388946533,63.3648567199707,-68.7131118774414,-3.7820160388946533,3.781336784362793,-93.4049301147461,-3.7813704013824463,3.781336784362793,-93.4049301147461,-3.7813704013824463,3.781336784362793,-93.4049301147461,-3.7813704013824463,3.781336784362793,-93.4049301147461,-3.7813704013824463,3.7815499305725098,-68.7131118774414,-63.36488342285156,3.7815499305725098,-68.7131118774414,-63.36488342285156,3.7815499305725098,-68.7131118774414,-63.36488342285156,3.7815499305725098,-68.7131118774414,-63.36488342285156,-63.3646240234375,3.781787157058716,68.71334075927734,-63.3646240234375,3.781787157058716,68.71334075927734,-63.3646240234375,3.781787157058716,68.71334075927734,-63.3646240234375,3.781787157058716,68.71334075927734,3.7820351123809814,-63.364871978759766,68.71309661865234,3.7820351123809814,-63.364871978759766,68.71309661865234,3.7820351123809814,-63.364871978759766,68.71309661865234,3.7820351123809814,-63.364871978759766,68.71309661865234,63.3651237487793,-3.781787157058716,68.71287536621094,63.3651237487793,-3.781787157058716,68.71287536621094,63.3651237487793,-3.781787157058716,68.71287536621094,63.3651237487793,-3.781787157058716,68.71287536621094,55.42794418334961,-49.783382415771484,-49.7835807800293,55.42794418334961,-49.783382415771484,-49.7835807800293,55.42794418334961,-49.783382415771484,-49.7835807800293,55.42794418334961,-49.783382415771484,-49.7835807800293,-93.4049072265625,3.7813589572906494,3.7816996574401855,-93.4049072265625,3.7813589572906494,3.7816996574401855,-93.4049072265625,3.7813589572906494,3.7816996574401855,-93.4049072265625,3.7813589572906494,3.7816996574401855,-55.42794418334961,49.78338623046875,49.7835807800293,-55.42794418334961,49.78338623046875,49.7835807800293,-55.42794418334961,49.78338623046875,49.7835807800293,-55.42794418334961,49.78338623046875,49.7835807800293,68.71311950683594,-63.3648796081543,3.7815308570861816,68.71311950683594,-63.3648796081543,3.7815308570861816,68.71311950683594,-63.3648796081543,3.7815308570861816,68.71311950683594,-63.3648796081543,3.7815308570861816,3.781013250350952,3.7813565731048584,-93.4049301147461,3.781013250350952,3.7813565731048584,-93.4049301147461,3.781013250350952,3.7813565731048584,-93.4049301147461,3.781013250350952,3.7813565731048584,-93.4049301147461,-63.3651237487793,3.781787157058716,-68.71288299560547,-63.3651237487793,3.781787157058716,-68.71288299560547,-63.3651237487793,3.781787157058716,-68.71288299560547,-63.3651237487793,3.781787157058716,-68.71288299560547,-63.3651237487793,-3.781778573989868,-68.71287536621094,-63.3651237487793,-3.781778573989868,-68.71287536621094,-63.3651237487793,-3.781778573989868,-68.71287536621094,-63.3651237487793,-3.781778573989868,-68.71287536621094,3.7815260887145996,-63.364871978759766,-68.71311950683594,3.7815260887145996,-63.364871978759766,-68.71311950683594,3.7815260887145996,-63.364871978759766,-68.71311950683594,3.7815260887145996,-63.364871978759766,-68.71311950683594,-3.781545639038086,68.7131118774414,63.36488342285156,-3.781545639038086,68.7131118774414,63.36488342285156,-3.781545639038086,68.7131118774414,63.36488342285156,-3.781545639038086,68.7131118774414,63.36488342285156,-3.7815303802490234,63.364871978759766,68.71312713623047,-3.7815303802490234,63.364871978759766,68.71312713623047,-3.7815303802490234,63.364871978759766,68.71312713623047,-3.7815303802490234,63.364871978759766,68.71312713623047,3.7820241451263428,68.7131118774414,63.3648567199707,3.7820241451263428,68.7131118774414,63.3648567199707,3.7820241451263428,68.7131118774414,63.3648567199707,3.7820241451263428,68.7131118774414,63.3648567199707,3.7820115089416504,-68.7131118774414,63.3648567199707,3.7820115089416504,-68.7131118774414,63.3648567199707,3.7820115089416504,-68.7131118774414,63.3648567199707,3.7820115089416504,-68.7131118774414,63.3648567199707,93.4049072265625,-3.7813589572906494,-3.7816989421844482,93.4049072265625,-3.7813589572906494,-3.7816989421844482,93.4049072265625,-3.7813589572906494,-3.7816989421844482,93.4049072265625,-3.7813589572906494,-3.7816989421844482,63.36486053466797,68.7131118774414,-3.7820181846618652,63.36486053466797,68.7131118774414,-3.7820181846618652,63.36486053466797,68.7131118774414,-3.7820181846618652,63.36486053466797,68.7131118774414,-3.7820181846618652,68.71312713623047,63.3648681640625,3.7815330028533936,68.71312713623047,63.3648681640625,3.7815330028533936,68.71312713623047,63.3648681640625,3.7815330028533936,68.71312713623047,63.3648681640625,3.7815330028533936,3.7815349102020264,63.364871978759766,-68.71312713623047,3.7815349102020264,63.364871978759766,-68.71312713623047,3.7815349102020264,63.364871978759766,-68.71312713623047,3.7815349102020264,63.364871978759766,-68.71312713623047,-3.7820308208465576,63.364871978759766,-68.71309661865234,-3.7820308208465576,63.364871978759766,-68.71309661865234,-3.7820308208465576,63.364871978759766,-68.71309661865234,-3.7820308208465576,63.364871978759766,-68.71309661865234,-68.71309661865234,-63.3648681640625,3.7820377349853516,-68.71309661865234,-63.3648681640625,3.7820377349853516,-68.71309661865234,-63.3648681640625,3.7820377349853516,-68.71309661865234,-63.3648681640625,3.7820377349853516,-68.71312713623047,-63.3648681640625,-3.7815308570861816,-68.71312713623047,-63.3648681640625,-3.7815308570861816,-68.71312713623047,-63.3648681640625,-3.7815308570861816,-68.71312713623047,-63.3648681640625,-3.7815308570861816,-55.42830276489258,-49.783382415771484,-49.78317642211914,-55.42830276489258,-49.783382415771484,-49.78317642211914,-55.42830276489258,-49.783382415771484,-49.78317642211914,-55.42830276489258,-49.783382415771484,-49.78317642211914,3.7813644409179688,-93.4049301147461,3.781342029571533,3.7813644409179688,-93.4049301147461,3.781342029571533,3.7813644409179688,-93.4049301147461,3.781342029571533,3.7813644409179688,-93.4049301147461,3.781342029571533,63.36488342285156,-68.7131118774414,3.781552314758301,63.36488342285156,-68.7131118774414,3.781552314758301,63.36488342285156,-68.7131118774414,3.781552314758301,63.36488342285156,-68.7131118774414,3.781552314758301,93.40494537353516,3.781350612640381,3.781012773513794,93.40494537353516,3.781350612640381,3.781012773513794,93.40494537353516,3.781350612640381,3.781012773513794,93.40494537353516,3.781350612640381,3.781012773513794,-3.7810142040252686,-3.781355857849121,93.4049301147461,-3.7810142040252686,-3.781355857849121,93.4049301147461,-3.7810142040252686,-3.781355857849121,93.4049301147461,-3.7810142040252686,-3.781355857849121,93.4049301147461,-63.36488723754883,-68.7131118774414,-3.781552314758301,-63.36488723754883,-68.7131118774414,-3.781552314758301,-63.36488723754883,-68.7131118774414,-3.781552314758301,-63.36488723754883,-68.7131118774414,-3.781552314758301,-3.7813453674316406,-93.4049301147461,3.7813704013824463,-3.7813453674316406,-93.4049301147461,3.7813704013824463,-3.7813453674316406,-93.4049301147461,3.7813704013824463,-3.7813453674316406,-93.4049301147461,3.7813704013824463,-63.364864349365234,-68.7131118774414,3.7820160388946533,-63.364864349365234,-68.7131118774414,3.7820160388946533,-63.364864349365234,-68.7131118774414,3.7820160388946533,-63.364864349365234,-68.7131118774414,3.7820160388946533,-3.7816994190216064,-3.7813565731048584,-93.40489196777344,-3.7816994190216064,-3.7813565731048584,-93.40489196777344,-3.7816994190216064,-3.7813565731048584,-93.40489196777344,-3.7816994190216064,-3.7813565731048584,-93.40489196777344,63.3646240234375,-3.781787157058716,-68.71334838867188,63.3646240234375,-3.781787157058716,-68.71334838867188,63.3646240234375,-3.781787157058716,-68.71334838867188,63.3646240234375,-3.781787157058716,-68.71334838867188,3.7810134887695312,-3.7813563346862793,-93.4049301147461,3.7810134887695312,-3.7813563346862793,-93.4049301147461,3.7810134887695312,-3.7813563346862793,-93.4049301147461,3.7810134887695312,-3.7813563346862793,-93.4049301147461,68.71309661865234,-63.364871978759766,-3.7820377349853516,68.71309661865234,-63.364871978759766,-3.7820377349853516,68.71309661865234,-63.364871978759766,-3.7820377349853516,68.71309661865234,-63.364871978759766,-3.7820377349853516,68.71288299560547,-3.781787157058716,-63.36511993408203,68.71288299560547,-3.781787157058716,-63.36511993408203,68.71288299560547,-3.781787157058716,-63.36511993408203,68.71288299560547,-3.781787157058716,-63.36511993408203,-93.40494537353516,-3.781350612640381,-3.7810134887695312,-93.40494537353516,-3.781350612640381,-3.7810134887695312,-93.40494537353516,-3.781350612640381,-3.7810134887695312,-93.40494537353516,-3.781350612640381,-3.7810134887695312,-68.71312713623047,63.364871978759766,-3.7815330028533936,-68.71312713623047,63.364871978759766,-3.7815330028533936,-68.71312713623047,63.364871978759766,-3.7815330028533936,-68.71312713623047,63.364871978759766,-3.7815330028533936,68.71334838867188,-3.7817912101745605,63.36461639404297,68.71334838867188,-3.7817912101745605,63.36461639404297,68.71334838867188,-3.7817912101745605,63.36461639404297,68.71334838867188,-3.7817912101745605,63.36461639404297,-3.782020092010498,-68.7131118774414,-63.3648567199707,-3.782020092010498,-68.7131118774414,-63.3648567199707,-3.782020092010498,-68.7131118774414,-63.3648567199707,-3.782020092010498,-68.7131118774414,-63.3648567199707,-3.781336784362793,93.4049301147461,3.781369686126709,-3.781336784362793,93.4049301147461,3.781369686126709,-3.781336784362793,93.4049301147461,3.781369686126709,-3.781336784362793,93.4049301147461,3.781369686126709,3.7813727855682373,93.4049301147461,3.7813427448272705,3.7813727855682373,93.4049301147461,3.7813427448272705,3.7813727855682373,93.4049301147461,3.7813427448272705,3.7813727855682373,93.4049301147461,3.7813427448272705,3.781700372695923,3.781355857849121,93.40489196777344,3.781700372695923,3.781355857849121,93.40489196777344,3.781700372695923,3.781355857849121,93.40489196777344,3.781700372695923,3.781355857849121,93.40489196777344,3.7816989421844482,-3.7813572883605957,93.40489196777344,3.7816989421844482,-3.7813572883605957,93.40489196777344,3.7816989421844482,-3.7813572883605957,93.40489196777344,3.7816989421844482,-3.7813572883605957,93.40489196777344,-3.781012773513794,3.7813572883605957,93.4049301147461,-3.781012773513794,3.7813572883605957,93.4049301147461,-3.781012773513794,3.7813572883605957,93.4049301147461,-3.781012773513794,3.7813572883605957,93.4049301147461,3.7815542221069336,68.7131118774414,-63.36488342285156,3.7815542221069336,68.7131118774414,-63.36488342285156,3.7815542221069336,68.7131118774414,-63.36488342285156,3.7815542221069336,68.7131118774414,-63.36488342285156,-49.78318405151367,-49.783382415771484,55.42829895019531,-49.78318405151367,-49.783382415771484,55.42829895019531,-49.78318405151367,-49.783382415771484,55.42829895019531,-49.78318405151367,-49.783382415771484,55.42829895019531,49.7835807800293,-49.783382415771484,55.42793655395508,49.7835807800293,-49.783382415771484,55.42793655395508,49.7835807800293,-49.783382415771484,55.42793655395508,49.7835807800293,-49.783382415771484,55.42793655395508,49.783565521240234,-55.42811965942383,49.78319549560547,49.783565521240234,-55.42811965942383,49.78319549560547,49.783565521240234,-55.42811965942383,49.78319549560547,49.783565521240234,-55.42811965942383,49.78319549560547,55.42829895019531,-49.783382415771484,49.783172607421875,55.42829895019531,-49.783382415771484,49.783172607421875,55.42829895019531,-49.783382415771484,49.783172607421875,55.42829895019531,-49.783382415771484,49.783172607421875,-49.7835578918457,-55.42811965942383,-49.783199310302734,-49.7835578918457,-55.42811965942383,-49.783199310302734,-49.7835578918457,-55.42811965942383,-49.783199310302734,-49.7835578918457,-55.42811965942383,-49.783199310302734,-49.783199310302734,-55.42811965942383,49.7835578918457,-49.783199310302734,-55.42811965942383,49.7835578918457,-49.783199310302734,-55.42811965942383,49.7835578918457,-49.783199310302734,-55.42811965942383,49.7835578918457,49.78318405151367,-49.783382415771484,-55.42829895019531,49.78318405151367,-49.783382415771484,-55.42829895019531,49.78318405151367,-49.783382415771484,-55.42829895019531,49.78318405151367,-49.783382415771484,-55.42829895019531,-55.42794418334961,-49.783382415771484,49.7835807800293,-55.42794418334961,-49.783382415771484,49.7835807800293,-55.42794418334961,-49.783382415771484,49.7835807800293,-55.42794418334961,-49.783382415771484,49.7835807800293,49.78318405151367,49.783382415771484,-55.42829895019531,49.78318405151367,49.783382415771484,-55.42829895019531,49.78318405151367,49.783382415771484,-55.42829895019531,49.78318405151367,49.783382415771484,-55.42829895019531,-49.78318405151367,49.78338623046875,55.42829895019531,-49.78318405151367,49.78338623046875,55.42829895019531,-49.78318405151367,49.78338623046875,55.42829895019531,-49.78318405151367,49.78338623046875,55.42829895019531,-49.783199310302734,55.42812728881836,49.7835578918457,-49.783199310302734,55.42812728881836,49.7835578918457,-49.783199310302734,55.42812728881836,49.7835578918457,-49.783199310302734,55.42812728881836,49.7835578918457,-63.3646240234375,-3.781782865524292,68.71334838867188,-63.3646240234375,-3.781782865524292,68.71334838867188,-63.3646240234375,-3.781782865524292,68.71334838867188,-63.3646240234375,-3.781782865524292,68.71334838867188,-68.71288299560547,-3.781778573989868,63.36511993408203,-68.71288299560547,-3.781778573989868,63.36511993408203,-68.71288299560547,-3.781778573989868,63.36511993408203,-68.71288299560547,-3.781778573989868,63.36511993408203,-3.7815349102020264,-63.364871978759766,68.71311950683594,-3.7815349102020264,-63.364871978759766,68.71311950683594,-3.7815349102020264,-63.364871978759766,68.71311950683594,-3.7815349102020264,-63.364871978759766,68.71311950683594,-3.7815582752227783,-68.7131118774414,63.36488342285156,-3.7815582752227783,-68.7131118774414,63.36488342285156,-3.7815582752227783,-68.7131118774414,63.36488342285156,-3.7815582752227783,-68.7131118774414,63.36488342285156,-3.782015800476074,68.7131118774414,-63.3648567199707,-3.782015800476074,68.7131118774414,-63.3648567199707,-3.782015800476074,68.7131118774414,-63.3648567199707,-3.782015800476074,68.7131118774414,-63.3648567199707,-68.71334838867188,3.781787157058716,-63.36461639404297,-68.71334838867188,3.781787157058716,-63.36461639404297,-68.71334838867188,3.781787157058716,-63.36461639404297,-68.71334838867188,3.781787157058716,-63.36461639404297,63.3651237487793,3.781782865524292,68.71288299560547,63.3651237487793,3.781782865524292,68.71288299560547,63.3651237487793,3.781782865524292,68.71288299560547,63.3651237487793,3.781782865524292,68.71288299560547,68.71334838867188,3.781778573989868,63.36461639404297,68.71334838867188,3.781778573989868,63.36461639404297,68.71334838867188,3.781778573989868,63.36461639404297,68.71334838867188,3.781778573989868,63.36461639404297,-68.71309661865234,63.3648796081543,3.7820355892181396,-68.71309661865234,63.3648796081543,3.7820355892181396,-68.71309661865234,63.3648796081543,3.7820355892181396,-68.71309661865234,63.3648796081543,3.7820355892181396,-68.71288299560547,3.7817912101745605,63.36511993408203,-68.71288299560547,3.7817912101745605,63.36511993408203,-68.71288299560547,3.7817912101745605,63.36511993408203,-68.71288299560547,3.7817912101745605,63.36511993408203,49.783203125,-55.42811965942383,-49.7835578918457,49.783203125,-55.42811965942383,-49.7835578918457,49.783203125,-55.42811965942383,-49.7835578918457,49.783203125,-55.42811965942383,-49.7835578918457],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-0.8930176496505737,-0.31821155548095703,0.31821513175964355,-0.8930176496505737,-0.31821155548095703,0.31821513175964355,-0.8930176496505737,-0.31821155548095703,0.31821513175964355,-0.8930176496505737,-0.31821155548095703,0.31821513175964355,-0.3939540982246399,0.8304173350334167,-0.3939635753631592,-0.3939540982246399,0.8304173350334167,-0.3939635753631592,-0.3939540982246399,0.8304173350334167,-0.3939635753631592,-0.3939540982246399,0.8304173350334167,-0.3939635753631592,-0.39820414781570435,0.8611265420913696,-0.31606101989746094,-0.39820414781570435,0.8611265420913696,-0.31606101989746094,-0.39820414781570435,0.8611265420913696,-0.31606101989746094,-0.39820414781570435,0.8611265420913696,-0.31606101989746094,-0.3181779980659485,0.8930322527885437,-0.3182079792022705,-0.3181779980659485,0.8930322527885437,-0.3182079792022705,-0.3181779980659485,0.8930322527885437,-0.3182079792022705,-0.3181779980659485,0.8930322527885437,-0.3182079792022705,0.3160579800605774,0.3982042074203491,0.8611275553703308,0.3160579800605774,0.3982042074203491,0.8611275553703308,0.3160579800605774,0.3982042074203491,0.8611275553703308,0.3160579800605774,0.3982042074203491,0.8611275553703308,0.39394938945770264,0.39396142959594727,0.8304205536842346,0.39394938945770264,0.39396142959594727,0.8304205536842346,0.39394938945770264,0.39396142959594727,0.8304205536842346,0.39394938945770264,0.39396142959594727,0.8304205536842346,-0.8930201530456543,0.3182116746902466,-0.31820809841156006,-0.8930201530456543,0.3182116746902466,-0.31820809841156006,-0.8930201530456543,0.3182116746902466,-0.31820809841156006,-0.8930201530456543,0.3182116746902466,-0.31820809841156006,-0.8304393887519836,0.3939298987388611,-0.39394134283065796,-0.8304393887519836,0.3939298987388611,-0.39394134283065796,-0.8304393887519836,0.3939298987388611,-0.39394134283065796,-0.8304393887519836,0.3939298987388611,-0.39394134283065796,-0.39819657802581787,0.8611276745796204,0.31606724858283997,-0.39819657802581787,0.8611276745796204,0.31606724858283997,-0.39819657802581787,0.8611276745796204,0.31606724858283997,-0.39819657802581787,0.8611276745796204,0.31606724858283997,0.3939548134803772,0.8304223418235779,0.3939521610736847,0.3939548134803772,0.8304223418235779,0.3939521610736847,0.3939548134803772,0.8304223418235779,0.3939521610736847,0.3939548134803772,0.8304223418235779,0.3939521610736847,0.398190438747406,0.8611446022987366,0.31602901220321655,0.398190438747406,0.8611446022987366,0.31602901220321655,0.398190438747406,0.8611446022987366,0.31602901220321655,0.398190438747406,0.8611446022987366,0.31602901220321655,0.39820146560668945,0.3160552680492401,-0.8611298203468323,0.39820146560668945,0.3160552680492401,-0.8611298203468323,0.39820146560668945,0.3160552680492401,-0.8611298203468323,0.39820146560668945,0.3160552680492401,-0.8611298203468323,0.8611258268356323,0.39821386337280273,-0.31605064868927,0.8611258268356323,0.39821386337280273,-0.31605064868927,0.8611258268356323,0.39821386337280273,-0.31605064868927,0.8611258268356323,0.39821386337280273,-0.31605064868927,0.8930308818817139,0.3181929588317871,-0.318196564912796,0.8930308818817139,0.3181929588317871,-0.318196564912796,0.8930308818817139,0.3181929588317871,-0.318196564912796,0.8930308818817139,0.3181929588317871,-0.318196564912796,0.8611277937889099,0.3160572052001953,-0.39820432662963867,0.8611277937889099,0.3160572052001953,-0.39820432662963867,0.8611277937889099,0.3160572052001953,-0.39820432662963867,0.8611277937889099,0.3160572052001953,-0.39820432662963867,0.8304156064987183,0.3939667344093323,-0.3939545154571533,0.8304156064987183,0.3939667344093323,-0.3939545154571533,0.8304156064987183,0.3939667344093323,-0.3939545154571533,0.8304156064987183,0.3939667344093323,-0.3939545154571533,0.39395228028297424,0.8304221630096436,-0.3939549922943115,0.39395228028297424,0.8304221630096436,-0.3939549922943115,0.39395228028297424,0.8304221630096436,-0.3939549922943115,0.39395228028297424,0.8304221630096436,-0.3939549922943115,0.31819266080856323,0.893029510974884,-0.31820082664489746,0.31819266080856323,0.893029510974884,-0.31820082664489746,0.31819266080856323,0.893029510974884,-0.31820082664489746,0.31819266080856323,0.893029510974884,-0.31820082664489746,0.8930361866950989,-0.3181893527507782,0.3181857466697693,0.8930361866950989,-0.3181893527507782,0.3181857466697693,0.8930361866950989,-0.3181893527507782,0.3181857466697693,0.8930361866950989,-0.3181893527507782,0.3181857466697693,-0.3182153105735779,0.31821152567863464,-0.8930174708366394,-0.3182153105735779,0.31821152567863464,-0.8930174708366394,-0.3182153105735779,0.31821152567863464,-0.8930174708366394,-0.3182153105735779,0.31821152567863464,-0.8930174708366394,-0.3939494788646698,0.39396119117736816,-0.8304205536842346,-0.3939494788646698,0.39396119117736816,-0.8304205536842346,-0.3939494788646698,0.39396119117736816,-0.8304205536842346,-0.3939494788646698,0.39396119117736816,-0.8304205536842346,0.8304232358932495,0.3939468264579773,0.3939582109451294,0.8304232358932495,0.3939468264579773,0.3939582109451294,0.8304232358932495,0.3939468264579773,0.3939582109451294,0.8304232358932495,0.3939468264579773,0.3939582109451294,-0.3181976079940796,-0.8930297493934631,-0.3181954622268677,-0.3181976079940796,-0.8930297493934631,-0.3181954622268677,-0.3181976079940796,-0.8930297493934631,-0.3181954622268677,-0.3181976079940796,-0.8930297493934631,-0.3181954622268677,-0.8611258268356323,-0.3160642981529236,-0.3982030749320984,-0.8611258268356323,-0.3160642981529236,-0.3982030749320984,-0.8611258268356323,-0.3160642981529236,-0.3982030749320984,-0.8611258268356323,-0.3160642981529236,-0.3982030749320984,-0.31608039140701294,-0.3982047438621521,-0.8611190915107727,-0.31608039140701294,-0.3982047438621521,-0.8611190915107727,-0.31608039140701294,-0.3982047438621521,-0.8611190915107727,-0.31608039140701294,-0.3982047438621521,-0.8611190915107727,-0.3939639627933502,-0.3939467966556549,-0.8304204940795898,-0.3939639627933502,-0.3939467966556549,-0.8304204940795898,-0.3939639627933502,-0.3939467966556549,-0.8304204940795898,-0.3939639627933502,-0.3939467966556549,-0.8304204940795898,0.39820337295532227,-0.8611286282539368,-0.31605619192123413,0.39820337295532227,-0.8611286282539368,-0.31605619192123413,0.39820337295532227,-0.8611286282539368,-0.31605619192123413,0.39820337295532227,-0.8611286282539368,-0.31605619192123413,0.3181878924369812,-0.8930350542068481,-0.31819045543670654,0.3181878924369812,-0.8930350542068481,-0.31819045543670654,0.3181878924369812,-0.8930350542068481,-0.31819045543670654,0.3181878924369812,-0.8930350542068481,-0.31819045543670654,0.3160671591758728,-0.8611257672309875,-0.39820101857185364,0.3160671591758728,-0.8611257672309875,-0.39820101857185364,0.3160671591758728,-0.8611257672309875,-0.39820101857185364,0.3160671591758728,-0.8611257672309875,-0.39820101857185364,-0.3982013761997223,0.3160552680492401,0.861129879951477,-0.3982013761997223,0.3160552680492401,0.861129879951477,-0.3982013761997223,0.3160552680492401,0.861129879951477,-0.3982013761997223,0.3160552680492401,0.861129879951477,0.31605467200279236,-0.39822202920913696,0.8611205220222473,0.31605467200279236,-0.39822202920913696,0.8611205220222473,0.31605467200279236,-0.39822202920913696,0.8611205220222473,0.31605467200279236,-0.39822202920913696,0.8611205220222473,0.39822128415107727,-0.3160440921783447,0.8611248135566711,0.39822128415107727,-0.3160440921783447,0.8611248135566711,0.39822128415107727,-0.3160440921783447,0.8611248135566711,0.39822128415107727,-0.3160440921783447,0.8611248135566711,0.830415666103363,-0.3939518928527832,-0.39396917819976807,0.830415666103363,-0.3939518928527832,-0.39396917819976807,0.830415666103363,-0.3939518928527832,-0.39396917819976807,0.830415666103363,-0.3939518928527832,-0.39396917819976807,-0.8930335640907288,0.31818917393684387,0.3181927800178528,-0.8930335640907288,0.31818917393684387,0.3181927800178528,-0.8930335640907288,0.31818917393684387,0.3181927800178528,-0.8930335640907288,0.31818917393684387,0.3181927800178528,-0.8304204344749451,0.3939615488052368,0.39394932985305786,-0.8304204344749451,0.3939615488052368,0.39394932985305786,-0.8304204344749451,0.3939615488052368,0.39394932985305786,-0.8304204344749451,0.3939615488052368,0.39394932985305786,0.8611295819282532,-0.39820489287376404,0.3160513937473297,0.8611295819282532,-0.39820489287376404,0.3160513937473297,0.8611295819282532,-0.39820489287376404,0.3160513937473297,0.8611295819282532,-0.39820489287376404,0.3160513937473297,0.31818902492523193,0.3181936740875244,-0.8930333852767944,0.31818902492523193,0.3181936740875244,-0.8930333852767944,0.31818902492523193,0.3181936740875244,-0.8930333852767944,0.31818902492523193,0.3181936740875244,-0.8930333852767944,-0.3982042670249939,0.3160568177700043,-0.861128032207489,-0.3982042670249939,0.3160568177700043,-0.861128032207489,-0.3982042670249939,0.3160568177700043,-0.861128032207489,-0.3982042670249939,0.3160568177700043,-0.861128032207489,-0.3982074558734894,-0.31605467200279236,-0.8611272573471069,-0.3982074558734894,-0.31605467200279236,-0.8611272573471069,-0.3982074558734894,-0.31605467200279236,-0.8611272573471069,-0.3982074558734894,-0.31605467200279236,-0.8611272573471069,0.31604087352752686,-0.3982185125350952,-0.8611272573471069,0.31604087352752686,-0.3982185125350952,-0.8611272573471069,0.31604087352752686,-0.3982185125350952,-0.8611272573471069,0.31604087352752686,-0.3982185125350952,-0.8611272573471069,-0.31601834297180176,0.8611423373222351,0.39820387959480286,-0.31601834297180176,0.8611423373222351,0.39820387959480286,-0.31601834297180176,0.8611423373222351,0.39820387959480286,-0.31601834297180176,0.8611423373222351,0.39820387959480286,-0.31606096029281616,0.39820629358291626,0.8611255288124084,-0.31606096029281616,0.39820629358291626,0.8611255288124084,-0.31606096029281616,0.39820629358291626,0.8611255288124084,-0.31606096029281616,0.39820629358291626,0.8611255288124084,0.31606805324554443,0.8611271977424622,0.39819690585136414,0.31606805324554443,0.8611271977424622,0.39819690585136414,0.31606805324554443,0.8611271977424622,0.39819690585136414,0.31606805324554443,0.8611271977424622,0.39819690585136414,0.31605327129364014,-0.8611239194869995,0.3982159495353699,0.31605327129364014,-0.8611239194869995,0.3982159495353699,0.31605327129364014,-0.8611239194869995,0.3982159495353699,0.31605327129364014,-0.8611239194869995,0.3982159495353699,0.8930177092552185,-0.31821155548095703,-0.31821513175964355,0.8930177092552185,-0.31821155548095703,-0.31821513175964355,0.8930177092552185,-0.31821155548095703,-0.31821513175964355,0.8930177092552185,-0.31821155548095703,-0.31821513175964355,0.39822056889533997,0.8611229658126831,-0.3160500228404999,0.39822056889533997,0.8611229658126831,-0.3160500228404999,0.39822056889533997,0.8611229658126831,-0.3160500228404999,0.39822056889533997,0.8611229658126831,-0.3160500228404999,0.8611273765563965,0.3982042968273163,0.3160584568977356,0.8611273765563965,0.3982042968273163,0.3160584568977356,0.8611273765563965,0.3982042968273163,0.3160584568977356,0.8611273765563965,0.3982042968273163,0.3160584568977356,0.31604790687561035,0.3982231020927429,-0.8611226081848145,0.31604790687561035,0.3982231020927429,-0.8611226081848145,0.31604790687561035,0.3982231020927429,-0.8611226081848145,0.31604790687561035,0.3982231020927429,-0.8611226081848145,-0.3160579800605774,0.39820435643196106,-0.8611276149749756,-0.3160579800605774,0.39820435643196106,-0.8611276149749756,-0.3160579800605774,0.39820435643196106,-0.8611276149749756,-0.3160579800605774,0.39820435643196106,-0.8611276149749756,-0.8611293435096741,-0.3981947600841522,0.31606513261795044,-0.8611293435096741,-0.3981947600841522,0.31606513261795044,-0.8611293435096741,-0.3981947600841522,0.31606513261795044,-0.8611293435096741,-0.3981947600841522,0.31606513261795044,-0.8611273169517517,-0.3982181251049042,-0.31604093313217163,-0.8611273169517517,-0.3982181251049042,-0.31604093313217163,-0.8611273169517517,-0.3982181251049042,-0.31604093313217163,-0.8611273169517517,-0.3982181251049042,-0.31604093313217163,-0.8304233551025391,-0.3939613699913025,-0.39394333958625793,-0.8304233551025391,-0.3939613699913025,-0.39394333958625793,-0.8304233551025391,-0.3939613699913025,-0.39394333958625793,-0.8304233551025391,-0.3939613699913025,-0.39394333958625793,0.31822317838668823,-0.8930189609527588,0.31819969415664673,0.31822317838668823,-0.8930189609527588,0.31819969415664673,0.31822317838668823,-0.8930189609527588,0.31819969415664673,0.31822317838668823,-0.8930189609527588,0.31819969415664673,0.398205429315567,-0.861126184463501,0.3160603642463684,0.398205429315567,-0.861126184463501,0.3160603642463684,0.398205429315567,-0.861126184463501,0.3160603642463684,0.398205429315567,-0.861126184463501,0.3160603642463684,0.8930307030677795,0.31819677352905273,0.31819313764572144,0.8930307030677795,0.31819677352905273,0.31819313764572144,0.8930307030677795,0.31819677352905273,0.31819313764572144,0.8930307030677795,0.31819677352905273,0.31819313764572144,-0.31818729639053345,-0.31819117069244385,0.8930348753929138,-0.31818729639053345,-0.31819117069244385,0.8930348753929138,-0.31818729639053345,-0.31819117069244385,0.8930348753929138,-0.31818729639053345,-0.31819117069244385,0.8930348753929138,-0.39820730686187744,-0.8611242771148682,-0.31606295704841614,-0.39820730686187744,-0.8611242771148682,-0.31606295704841614,-0.39820730686187744,-0.8611242771148682,-0.31606295704841614,-0.39820730686187744,-0.8611242771148682,-0.31606295704841614,-0.3181917071342468,-0.8930321931838989,0.31819429993629456,-0.3181917071342468,-0.8930321931838989,0.31819429993629456,-0.3181917071342468,-0.8930321931838989,0.31819429993629456,-0.3181917071342468,-0.8930321931838989,0.31819429993629456,-0.39820390939712524,-0.8611285090446472,0.31605613231658936,-0.39820390939712524,-0.8611285090446472,0.31605613231658936,-0.39820390939712524,-0.8611285090446472,0.31605613231658936,-0.39820390939712524,-0.8611285090446472,0.31605613231658936,-0.3181929588317871,-0.3181893825531006,-0.8930334448814392,-0.3181929588317871,-0.3181893825531006,-0.8930334448814392,-0.3181929588317871,-0.3181893825531006,-0.8930334448814392,-0.3181929588317871,-0.3181893825531006,-0.8930334448814392,0.398214727640152,-0.3160427510738373,-0.8611282706260681,0.398214727640152,-0.3160427510738373,-0.8611282706260681,0.398214727640152,-0.3160427510738373,-0.8611282706260681,0.398214727640152,-0.3160427510738373,-0.8611282706260681,0.31819266080856323,-0.31819653511047363,-0.8930309414863586,0.31819266080856323,-0.31819653511047363,-0.8930309414863586,0.31819266080856323,-0.31819653511047363,-0.8930309414863586,0.31819266080856323,-0.31819653511047363,-0.8930309414863586,0.8611248731613159,-0.39820438623428345,-0.31606507301330566,0.8611248731613159,-0.39820438623428345,-0.31606507301330566,0.8611248731613159,-0.39820438623428345,-0.31606507301330566,0.8611248731613159,-0.39820438623428345,-0.31606507301330566,0.8611255884170532,-0.3160474896430969,-0.39821693301200867,0.8611255884170532,-0.3160474896430969,-0.39821693301200867,0.8611255884170532,-0.3160474896430969,-0.39821693301200867,0.8611255884170532,-0.3160474896430969,-0.39821693301200867,-0.8930345773696899,-0.3181912899017334,-0.31818774342536926,-0.8930345773696899,-0.3181912899017334,-0.31818774342536926,-0.8930345773696899,-0.3181912899017334,-0.31818774342536926,-0.8930345773696899,-0.3181912899017334,-0.31818774342536926,-0.8611279726028442,0.3982178866863251,-0.3160398602485657,-0.8611279726028442,0.3982178866863251,-0.3160398602485657,-0.8611279726028442,0.3982178866863251,-0.3160398602485657,-0.8611279726028442,0.3982178866863251,-0.3160398602485657,0.8611286878585815,-0.3160666823387146,0.39819496870040894,0.8611286878585815,-0.3160666823387146,0.39819496870040894,0.8611286878585815,-0.3160666823387146,0.39819496870040894,0.8611286878585815,-0.3160666823387146,0.39819496870040894,-0.31604599952697754,-0.8611259460449219,-0.3982173800468445,-0.31604599952697754,-0.8611259460449219,-0.3982173800468445,-0.31604599952697754,-0.8611259460449219,-0.3982173800468445,-0.31604599952697754,-0.8611259460449219,-0.3982173800468445,-0.3182077705860138,0.8930187225341797,0.31821584701538086,-0.3182077705860138,0.8930187225341797,0.31821584701538086,-0.3182077705860138,0.8930187225341797,0.31821584701538086,-0.3182077705860138,0.8930187225341797,0.31821584701538086,0.31819307804107666,0.8930350542068481,0.3181852102279663,0.31819307804107666,0.8930350542068481,0.3181852102279663,0.31819307804107666,0.8930350542068481,0.3181852102279663,0.31819307804107666,0.8930350542068481,0.3181852102279663,0.3181931972503662,0.3181889057159424,0.893033504486084,0.3181931972503662,0.3181889057159424,0.893033504486084,0.3181931972503662,0.3181889057159424,0.893033504486084,0.3181931972503662,0.3181889057159424,0.893033504486084,0.3182152509689331,-0.3182116150856018,0.893017590045929,0.3182152509689331,-0.3182116150856018,0.893017590045929,0.3182152509689331,-0.3182116150856018,0.893017590045929,0.3182152509689331,-0.3182116150856018,0.893017590045929,-0.3182075023651123,0.31821173429489136,0.8930203914642334,-0.3182075023651123,0.31821173429489136,0.8930203914642334,-0.3182075023651123,0.31821173429489136,0.8930203914642334,-0.3182075023651123,0.31821173429489136,0.8930203914642334,0.3160323202610016,0.8611453771591187,-0.39818620681762695,0.3160323202610016,0.8611453771591187,-0.39818620681762695,0.3160323202610016,0.8611453771591187,-0.39818620681762695,0.3160323202610016,0.8611453771591187,-0.39818620681762695,-0.39394327998161316,-0.39396142959594727,0.8304233551025391,-0.39394327998161316,-0.39396142959594727,0.8304233551025391,-0.39394327998161316,-0.39396142959594727,0.8304233551025391,-0.39394327998161316,-0.39396142959594727,0.8304233551025391,0.39394742250442505,-0.3939295709133148,0.8304365277290344,0.39394742250442505,-0.3939295709133148,0.8304365277290344,0.39394742250442505,-0.3939295709133148,0.8304365277290344,0.39394742250442505,-0.3939295709133148,0.8304365277290344,0.393976092338562,-0.8304168581962585,0.39394256472587585,0.393976092338562,-0.8304168581962585,0.39394256472587585,0.393976092338562,-0.8304168581962585,0.39394256472587585,0.393976092338562,-0.8304168581962585,0.39394256472587585,0.8304234743118286,-0.39396101236343384,0.3939433991909027,0.8304234743118286,-0.39396101236343384,0.3939433991909027,0.8304234743118286,-0.39396101236343384,0.3939433991909027,0.8304234743118286,-0.39396101236343384,0.3939433991909027,-0.3939476013183594,-0.8304222822189331,-0.3939594626426697,-0.3939476013183594,-0.8304222822189331,-0.3939594626426697,-0.3939476013183594,-0.8304222822189331,-0.3939594626426697,-0.3939476013183594,-0.8304222822189331,-0.3939594626426697,-0.3939593434333801,-0.8304222822189331,0.3939477205276489,-0.3939593434333801,-0.8304222822189331,0.3939477205276489,-0.3939593434333801,-0.8304222822189331,0.3939477205276489,-0.3939593434333801,-0.8304222822189331,0.3939477205276489,0.393926739692688,-0.3939448595046997,-0.8304391503334045,0.393926739692688,-0.3939448595046997,-0.8304391503334045,0.393926739692688,-0.3939448595046997,-0.8304391503334045,0.393926739692688,-0.3939448595046997,-0.8304391503334045,-0.8304203152656555,-0.39394691586494446,0.39396411180496216,-0.8304203152656555,-0.39394691586494446,0.39396411180496216,-0.8304203152656555,-0.39394691586494446,0.39396411180496216,-0.8304203152656555,-0.39394691586494446,0.39396411180496216,0.3939414918422699,0.393930047750473,-0.8304392099380493,0.3939414918422699,0.393930047750473,-0.8304392099380493,0.3939414918422699,0.393930047750473,-0.8304392099380493,0.3939414918422699,0.393930047750473,-0.8304392099380493,-0.3939580023288727,0.39394649863243103,0.8304234743118286,-0.3939580023288727,0.39394649863243103,0.8304234743118286,-0.3939580023288727,0.39394649863243103,0.8304234743118286,-0.3939580023288727,0.39394649863243103,0.8304234743118286,-0.39395201206207275,0.8304221630096436,0.39395517110824585,-0.39395201206207275,0.8304221630096436,0.39395517110824585,-0.39395201206207275,0.8304221630096436,0.39395517110824585,-0.39395201206207275,0.8304221630096436,0.39395517110824585,-0.39820295572280884,-0.3160640299320221,0.8611259460449219,-0.39820295572280884,-0.3160640299320221,0.8611259460449219,-0.39820295572280884,-0.3160640299320221,0.8611259460449219,-0.39820295572280884,-0.3160640299320221,0.8611259460449219,-0.8611248135566711,-0.3160442113876343,0.39822128415107727,-0.8611248135566711,-0.3160442113876343,0.39822128415107727,-0.8611248135566711,-0.3160442113876343,0.39822128415107727,-0.8611248135566711,-0.3160442113876343,0.39822128415107727,-0.31604111194610596,-0.3982183337211609,0.8611273169517517,-0.31604111194610596,-0.3982183337211609,0.8611273169517517,-0.31604111194610596,-0.3982183337211609,0.8611273169517517,-0.31604111194610596,-0.3982183337211609,0.8611273169517517,-0.3160600960254669,-0.8611261248588562,0.39820581674575806,-0.3160600960254669,-0.8611261248588562,0.39820581674575806,-0.3160600960254669,-0.8611261248588562,0.39820581674575806,-0.3160600960254669,-0.8611261248588562,0.39820581674575806,-0.31606826186180115,0.8611270189285278,-0.39819711446762085,-0.31606826186180115,0.8611270189285278,-0.39819711446762085,-0.31606826186180115,0.8611270189285278,-0.39819711446762085,-0.31606826186180115,0.8611270189285278,-0.39819711446762085,-0.8611301183700562,0.3160545825958252,-0.3982013463973999,-0.8611301183700562,0.3160545825958252,-0.3982013463973999,-0.8611301183700562,0.3160545825958252,-0.3982013463973999,-0.8611301183700562,0.3160545825958252,-0.3982013463973999,0.3982081413269043,0.31607723236083984,0.8611186742782593,0.3982081413269043,0.31607723236083984,0.8611186742782593,0.3982081413269043,0.31607723236083984,0.8611186742782593,0.3982081413269043,0.31607723236083984,0.8611186742782593,0.8611276745796204,0.3160439729690552,0.3982152044773102,0.8611276745796204,0.3160439729690552,0.3982152044773102,0.8611276745796204,0.3160439729690552,0.3982152044773102,0.8611276745796204,0.3160439729690552,0.3982152044773102,-0.8611273765563965,0.39820489287376404,0.3160577416419983,-0.8611273765563965,0.39820489287376404,0.3160577416419983,-0.8611273765563965,0.39820489287376404,0.3160577416419983,-0.8611273765563965,0.39820489287376404,0.3160577416419983,-0.8611289858818054,0.3160620927810669,0.3981979489326477,-0.8611289858818054,0.3160620927810669,0.3981979489326477,-0.8611289858818054,0.3160620927810669,0.3981979489326477,-0.8611289858818054,0.3160620927810669,0.3981979489326477,0.3939596116542816,-0.8304221630096436,-0.39394763112068176,0.3939596116542816,-0.8304221630096436,-0.39394763112068176,0.3939596116542816,-0.8304221630096436,-0.39394763112068176,0.3939596116542816,-0.8304221630096436,-0.39394763112068176],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.04120219498872757,0.12086033821105957,0.05345028638839722,0.08731907606124878,0.11187556385993958,0.0670785903930664,0.6875278949737549,0.13345998525619507,0.04903397709131241,0.004412055015563965,0.0771341323852539,0.03593343496322632,0.11686006188392639,0.03130292892456055,0.31248292326927185,0.10850334167480469,0.0489392951130867,0.02688688039779663,0.06469712406396866,0.01563972234725952,0.0803603008389473,0.0917351245880127,0.3686402440071106,0.07315778732299805,0.08036012947559357,0.12086033821105957,0.09260810911655426,0.08731895685195923,0.10864977538585663,0.015640199184417725,0.31252771615982056,0.008440375328063965,0.07252871245145798,0.0917351245880127,0.08828651905059814,0.02688688039779663,0.10081818699836731,0.02688688039779663,0.4936917722225189,0.19815367460250854,0.08025602996349335,0.04575681686401367,0.08838120102882385,0.004412055015563965,0.1084604263305664,0.0983855128288269,0.4374849796295166,0.23353207111358643,0.037787072360515594,0.08731907606124878,0.049033790826797485,0.08731907606124878,0.1084604263305664,0.06366342306137085,0.18752798438072205,0.38353127241134644,0.04542912542819977,0.004412055015563965,0.08025602996349335,0.034130990505218506,0.1040443629026413,0.06484419107437134,0.18748320639133453,0.4834633469581604,0.006349444389343262,0.5731359720230103,0.006555216386914253,0.02688688039779663,0.06469712406396866,0.01905524730682373,0.07694480568170547,0.0917351245880127,0.030523335561156273,0.02688688039779663,0.0771341323852539,0.043954312801361084,0.08477634936571121,0.004412055015563965,0.4374811053276062,0.35838615894317627,0.014292115345597267,0.12086033821105957,0.03061802126467228,0.004412055015563965,0.0964021235704422,0.015639781951904297,0.4934193789958954,0.32318025827407837,0.053450047969818115,0.01905524730682373,0.06469716131687164,0.0917351245880127,0.09630745649337769,0.05377775430679321,0.49373188614845276,0.44814980030059814,0.009876048192381859,0.0917351245880127,0.09298662841320038,0.01905524730682373,0.11999154090881348,0.09396946430206299,0.6183853149414062,0.3231801986694336,0.00987587682902813,0.12086033821105957,0.029955485835671425,0.12086033821105957,0.06469673663377762,0.007808566093444824,0.562527596950531,0.2587568163871765,0.0299553032964468,0.0917351245880127,0.05686555057764053,0.01905524730682373,0.09289196133613586,0.05377775430679321,0.5065897703170776,0.32315701246261597,0.056571945548057556,0.0421520471572876,0.09279727190732956,0.03130292892456055,0.1200861781835556,0.07149463891983032,0.5624833106994629,0.35836511850357056,0.018086323514580727,0.004412055015563965,0.056571945548057556,0.04575687646865845,0.11648134887218475,0.07149463891983032,0.18748287856578827,0.3584839701652527,0.017707442864775658,0.09173506498336792,0.09602326154708862,0.08731895685195923,0.1120648980140686,0.015640199184417725,0.1875280737876892,0.2584848999977112,0.05345025658607483,0.12086033821105957,0.06128161400556564,0.011223673820495605,0.07252849638462067,0.08731907606124878,0.3125280439853668,0.13357031345367432,0.03337060660123825,0.08731913566589355,0.0769449844956398,0.087319016456604,0.10864977538585663,0.0078089237213134766,0.5625283718109131,0.133742094039917,0.08025602996349335,0.03773587942123413,0.10043948143720627,0.06484419107437134,0.12046489119529724,0.03130292892456055,0.5624833703041077,0.23337173461914062,0.03412818908691406,0.02688688039779663,0.08025602996349335,0.04215192794799805,0.11206528544425964,0.0983855128288269,0.18748319149017334,0.23347699642181396,0.006460724398493767,0.087319016456604,0.017707442864775658,0.087319016456604,0.06252795457839966,0.25844651460647583,0.1120649129152298,0.023471713066101074,0.014576157554984093,0.05377775430679321,0.04561847448348999,0.058193862438201904,0.1008182168006897,0.01563972234725952,0.25627732276916504,0.44812923669815063,0.006148636341094971,0.4481179118156433,0.05686555057764053,0.026886820793151855,0.08819183707237244,0.12086033821105957,0.10893382132053375,0.05377775430679321,0.018086323514580727,0.03130292892456055,0.056571945548057556,0.05017292499542236,0.06248307228088379,0.48360395431518555,0.10883913934230804,0.03130292892456055,0.025539224967360497,0.05819380283355713,0.07252870500087738,0.01563972234725952,0.1039496660232544,0.12086033821105957,0.49378809332847595,0.07314485311508179,0.014292331412434578,0.087319016456604,0.025539005175232887,0.087319016456604,0.10864977538585663,0.023471713066101074,0.4375278651714325,0.008257150650024414,0.009970692917704582,0.03130298852920532,0.014292115345597267,0.05819380283355713,0.053450047969818115,0.023471355438232422,0.3811866044998169,0.07312166690826416,0.0490339919924736,0.0917351245880127,0.0803602933883667,0.01563972234725952,0.10432836413383484,0.05377775430679321,0.6185856461524963,0.44816309213638306,0.02601257897913456,0.03130292892456055,0.061281636357307434,0.05819380283355713,0.06469713896512985,0.02688688039779663,0.6315924525260925,0.32315754890441895,0.03061799891293049,0.03130292892456055,0.06911320239305496,0.023471355438232422,0.09602341055870056,0.09173518419265747,0.7433825731277466,0.32318103313446045,0.08477634936571121,0.05377775430679321,0.10043948143720627,0.0983855128288269,0.11629162728786469,0.0652761459350586,0.687483012676239,0.4834805130958557,0.037787072360515594,0.12086033821105957,0.041202202439308167,0.08731907606124878,0.11187553405761719,0.06366342306137085,0.5625277757644653,0.00847846269607544,0.010065404698252678,0.004412055015563965,0.05345005542039871,0.035933494567871094,0.1008182168006897,0.03130298852920532,0.5624833703041077,0.10848653316497803,0.02601257897913456,0.02688688039779663,0.06911320239305496,0.01905524730682373,0.07252870500087738,0.05819380283355713,0.3685356378555298,0.19816696643829346,0.029955485835671425,0.08731913566589355,0.06469696015119553,0.12086033821105957,0.10864977538585663,0.011224091053009033,0.43752849102020264,0.38332629203796387,0.07694479078054428,0.05819380283355713,0.10053417086601257,0.08731895685195923,0.10423369705677032,0.01905524730682373,0.5065778493881226,0.19815611839294434,0.017991656437516212,0.05377775430679321,0.0803602933883667,0.05819380283355713,0.10423369705677032,0.01563972234725952,0.1188262403011322,0.4481416940689087,0.0065551940351724625,0.03130298852920532,0.05686555057764053,0.023471355438232422,0.084776371717453,0.12086033821105957,0.7436801791191101,0.07315462827682495,0.025539247319102287,0.09173518419265747,0.06460244953632355,0.05377769470214844,0.10423369705677032,0.023471355438232422,0.11862531304359436,0.5731591582298279,0.06118693947792053,0.05377769470214844,0.06911322474479675,0.0917351245880127,0.10081818699836731,0.023471355438232422,0.5063889026641846,0.4481391906738281,0.022123711183667183,0.09173518419265747,0.08487099409103394,0.02688688039779663,0.10423369705677032,0.02688688039779663,0.38155296444892883,0.3231542706489563,0.02259708009660244,0.03130292892456055,0.06128162145614624,0.02688688039779663,0.08819186687469482,0.05819392204284668,0.24363532662391663,0.5731584429740906,0.03337061405181885,0.12086033821105957,0.06469673663377762,0.011223673820495605,0.0691133663058281,0.08731907606124878,0.687528133392334,0.3834933042526245,0.017707636579871178,0.12086033821105957,0.0964021235704422,0.01905524730682373,0.11657601594924927,0.09396946430206299,0.1313704252243042,0.32313746213912964,0.006460549309849739,0.0917351245880127,0.03403352200984955,0.004412055015563965,0.09298662841320038,0.015639781951904297,0.13138353824615479,0.1981390118598938,0.014576157554984093,0.02688688039779663,0.0299553032964468,0.05819392204284668,0.0803602784872055,0.026886820793151855,0.38124242424964905,0.4481261968612671,0.033370792865753174,0.05819392204284668,0.0803602784872055,0.023471355438232422,0.12037022411823273,0.05377775430679321,0.6183971166610718,0.19817936420440674,0.05345005542039871,0.058193862438201904,0.0964021235704422,0.02688688039779663,0.11999151110649109,0.0983855128288269,0.6313499808311462,0.1981356143951416,0.056865572929382324,0.058193862438201904,0.06920789182186127,0.03130286931991577,0.0964021235704422,0.023471355438232422,0.3686973452568054,0.4481528401374817,0.014481494203209877,0.03130292892456055,0.056571945548057556,0.05377781391143799,0.06911319494247437,0.05377769470214844,0.3124830424785614,0.48353415727615356,0.022123875096440315,0.087319016456604,0.08819165080785751,0.08731907606124878,0.10864977538585663,0.02688688039779663,0.18752774596214294,0.5084468126296997,0.022123703733086586,0.05819380283355713,0.02259708009660244,0.02688688039779663,0.07252870500087738,0.01905524730682373,0.1313396394252777,0.5731350779533386,0.00646076537668705,0.12086033821105957,0.05686537176370621,0.12086033821105957,0.06128161400556564,0.007808566093444824,0.18752765655517578,0.1335013508796692,0.04561866074800491,0.12086033821105957,0.053450047969818115,0.007808566093444824,0.06252825260162354,0.1334705352783203,0.06469693779945374,0.08731907606124878,0.006339132785797119,0.3231348991394043,0.006460549309849739,0.05819380283355713,0.07262339442968369,0.03130286931991577,0.09298662841320038,0.023471355438232422,0.009875854477286339,0.087319016456604,0.08477649837732315,0.08731907606124878,0.1120649129152298,0.02688688039779663,0.31252795457839966,0.25839555263519287,0.009876048192381859,0.05819380283355713,0.09298662841320038,0.02688688039779663,0.11657601594924927,0.0983855128288269,0.36867624521255493,0.3231545090675354,0.06252825260162354,0.383209228515625,0.08036010712385178,0.087319016456604,0.0881916955113411,0.09173506498336792,0.1120649129152298,0.0078089237213134766,0.053450047969818115,0.01563972234725952,0.06128164380788803,0.0917351245880127,0.08828655630350113,0.03130298852920532,0.6312947273254395,0.073131263256073,0.061281830072402954,0.12086033821105957,0.08477656543254852,0.09173506498336792,0.1120649129152298,0.011224091053009033,0.6875279545783997,0.008391082286834717,0.06911320239305496,0.01563972234725952,0.06911322474479675,0.05819380283355713,0.10053417086601257,0.12086033821105957,0.631377100944519,0.44813835620880127,0.033370815217494965,0.0917351245880127,0.05686555057764053,0.01563972234725952,0.08487105369567871,0.03130298852920532,0.7435976266860962,0.44816213846206665,0.04561866074800491,0.08731907606124878,0.05686540901660919,0.08731907606124878,0.1084604263305664,0.0670785903930664,0.3125280737876892,0.3833693861961365,0.037786878645420074,0.05819380283355713,0.04552379250526428,0.02688688039779663,0.06128161400556564,0.01563972234725952,0.13140809535980225,0.4481407403945923,0.03403349965810776,0.03130292892456055,0.05345005542039871,0.0917351245880127,0.06911320239305496,0.026886820793151855,0.2564394772052765,0.19814354181289673,0.017707636579871178,0.05819380283355713,0.053450047969818115,0.026886820793151855,0.11234933137893677,0.05377775430679321,0.11863547563552856,0.32315850257873535,0.025539016351103783,0.12086033821105957,0.0625276267528534,0.5084590315818787,0.07694500684738159,0.12086033821105957,0.10864977538585663,0.01905524730682373,0.014292312785983086,0.09173506498336792,0.022123919799923897,0.12086033821105957,0.1120648980140686,0.01905524730682373,0.43752825260162354,0.2587151527404785,0.05686517059803009,0.011223673820495605,0.07252854108810425,0.12086033821105957,0.09260810166597366,0.12086033821105957,0.4375276267528534,0.13337987661361694,0.053450047969818115,0.011223673820495605,0.06128180772066116,0.08731907606124878,0.09602323174476624,0.12086033821105957,0.687527596950531,0.2587602138519287,0.049033790826797485,0.12086033821105957,0.05686517059803009,0.007808566093444824,0.06911341845989227,0.12086033821105957,0.5625280141830444,0.38350802659988403,0.017991656437516212,0.02688688039779663,0.07694479078054428,0.02688688039779663,0.09602341055870056,0.05819380283355713,0.24360424280166626,0.3231614828109741,0.045429132878780365,0.03130298852920532,0.06248307228088379,0.2334902286529541,0.11206528544425964,0.07149463891983032,0.11960287392139435,0.023281991481781006,0.026107268407940865,0.05377775430679321,0.030523335561156273,0.05377775430679321,0.08025602996349335,0.05377769470214844,0.6874831914901733,0.3583640456199646,0.022502413019537926,0.004412055015563965,0.022502413019537926,0.05377775430679321,0.08025602996349335,0.05017286539077759,0.18748320639133453,0.6085007190704346,0.026107246056199074,0.004412055015563965,0.03412819653749466,0.05377775430679321,0.0771341323852539,0.0519753098487854,0.3124833106994629,0.2334464192390442,0.05345005542039871,0.051975369453430176,0.062483012676239014,0.3585008978843689,0.0727180615067482,0.05377769470214844,0.11244398355484009,0.03130292892456055,0.1084604263305664,0.07149463891983032,0.11648134887218475,0.12086033821105957,0.11960287392139435,0.02688688039779663,0.31248316168785095,0.35852259397506714,0.006460549309849739,0.05377775430679321,0.08838121592998505,0.05377775430679321,0.11941350996494293,0.06347370147705078,0.6874832510948181,0.10852515697479248,0.0490339919924736,0.03130298852920532,0.11648097634315491,0.02508443593978882,0.1200861781835556,0.12086033821105957,0.6874829530715942,0.23349487781524658,0.014481494203209877,0.004412055015563965,0.05345005542039871,0.043954432010650635,0.0964021235704422,0.03130292892456055,0.43748292326927185,0.4835529923439026,0.05657196044921875,0.037735939025878906,0.061092279851436615,0.03130286931991577,0.10442306846380234,0.03130298852920532,0.5624828934669495,0.4834739565849304,0.006460549309849739,0.004412055015563965,0.056571945548057556,0.03413110971450806,0.06248317286372185,0.6084953546524048,0.06469713896512985,0.03130286931991577,0.006358683109283447,0.198136568069458,0.04552381485700607,0.05377781391143799,0.04561847448348999,0.0917351245880127,0.0803602933883667,0.01905524730682373,0.04120240360498428,0.0917351245880127,0.04893931746482849,0.05377781391143799,0.07694479078054428,0.01905524730682373,0.7436245679855347,0.1981593370437622,0.06469712406396866,0.023471355438232422,0.06469712406396866,0.05819380283355713,0.11197057366371155,0.09396946430206299,0.11861595511436462,0.1981601119041443,0.06128162145614624,0.023471355438232422,0.084776371717453,0.05819392204284668,0.10855509340763092,0.09396940469741821,0.25629860162734985,0.32313108444213867,0.07694478332996368,0.023471355438232422,0.09260791540145874,0.05819380283355713,0.1169547289609909,0.05377775430679321,0.256334125995636,0.07313430309295654,0.049033984541893005,0.058193862438201904,0.1008182168006897,0.01905524730682373,0.1039496511220932,0.08731895685195923,0.2435668408870697,0.448164165019989,0.07252871245145798,0.023471355438232422,0.09260791540145874,0.09173518419265747,0.10855511575937271,0.12086033821105957,0.38128527998924255,0.19813251495361328,0.056865572929382324,0.0917351245880127,0.07252871245145798,0.026886820793151855,0.11197061836719513,0.12086033821105957,0.2435913383960724,0.19816231727600098,0.009970737621188164,0.02688688039779663,0.04120238125324249,0.05819380283355713,0.06128162145614624,0.01905524730682373,0.6186096668243408,0.07316023111343384,0.037786878645420074,0.0917351245880127,0.07694479078054428,0.01563972234725952,0.10091288387775421,0.05377775430679321,0.5063652992248535,0.07313716411590576,0.010065404698252678,0.05377775430679321,0.10404433310031891,0.0983855128288269,0.11941350996494293,0.0670785903930664,0.4374832212924957,0.10858356952667236],\n \"normalized\": false\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [283,23,19,231,319,235,27,31,363,338,273,32,39,279,171,147,331,47,55,63,51,67,71,183,75,311,143,79,83,195,222,297,351,219,87,371,90,313,271,259,207,203,236,102,155,111,383,107,291,335,119,247,323,159,287,303,127,179,131,255,135,139,375,3,327,347,308,213,140,91,210,230,70,275,278,348,173,122,269,157,114,36,185,41,193,293,190,108,268,113,28,8,4,294,13,69,18,162,166,9,374,34,82,358,194,26,2,134,361,154,94,233,202,227,277,160,168,117,346,343,99,315,103,260,133,373,246,78,146,212,109,104,276,180,68,301,264,124,369,125,266,284,289,221,177,218,73,381,250,106,172,300,120,33,136,336,322,130,382,112,320,380,298,354,350,238,158,98,285,349,121,249,74,142,228,225,88,176,56,53,132,344,376,189,76,192,274,10,35,368,72,217,237,148,77,1,200,196,342,288,116,165,281,16,184,52,48,241,145,45,25,93,256,126,282,286,339,164,161,42,49,181,92,100,204,341,324,296,378,334,138,312,205,101,149,30,81,337,137,332,105,141,214,226,206,314,5,80,29,60,329,65,44,253,240,66,50,62,299,325,318,328,292,64,37,20,85,366,86,22,58,330,61,254,321,242,211,307,175,15,7,11,310,302,306,198,317,326,353,209,174,21,169,17,283,367,23,231,355,319,27,263,31,338,163,273,39,43,279,147,191,331,55,59,63,67,295,71,75,267,311,79,151,83,222,340,297,219,187,87,90,224,313,259,95,207,236,96,102,111,115,383,291,167,335,247,243,323,287,123,303,179,251,131,135,379,139,3,199,327,308,304,213,91,110,210,70,14,275,348,352,173,269,97,157,36,84,185,193,356,293,108,89,268,28,261,8,294,357,13,18,170,162,9,262,374,82,6,358,26,258,2,361,150,154,233,197,202,277,272,160,117,377,346,99,270,315,260,24,133,246,239,78,212,208,109,276,40,180,301,309,264,369,364,125,284,280,289,177,54,218,381,129,250,172,305,300,33,372,136,112,156,320,298,316,354,238,245,158,285,223,349,249,178,74,228,232,225,176,252,56,132,0,344,189,144,76,274,12,10,368,265,72,237,153,148,1,257,200,342,220,288,165,290,281,184,216,52,241,244,145,25,360,93,126,365,282,339,333,164,42,186,49,92,152,100,341,345,324,378,118,334,149,362,30,105,248,141,226,201,206,44,57,253,66,182,50,328,188,292,366,370,86,58,46,330,254,128,321,211,215,307,15,359,7,198,234,317,353,229,209,21,38,169]\n },\n \"boundingSphere\": {\n \"center\": [0,0,0],\n \"radius\": 161.78209344582697\n }\n },\n faceValues: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24],\n rotationCombinations: {\n \"1,2\": [0, 0, 180],\n \"1,3\": [-180, 0, 90],\n \"1,4\": [90, 0, -90],\n \"1,5\": [-90, 0, -90],\n \"1,6\": [-130, -90, -40],\n \"1,7\": [0, -180, 90],\n \"1,8\": [-90, 0, 90],\n \"1,9\": [90, 0, 90],\n \"1,10\": [50, -90, -40],\n \"1,11\": [0, 90, -180],\n \"1,12\": [0, 90, 0],\n \"1,13\": [180, 0, 0],\n \"1,14\": [0, 180, 0],\n \"1,15\": [0, 0, 90],\n \"1,16\": [90, 180, 0],\n \"1,17\": [90, 0, 0],\n \"1,18\": [-130, 90, 40],\n \"1,19\": [0, 0, -90],\n \"1,20\": [90, 0, -180],\n \"1,21\": [-90, 0, 0],\n \"1,22\": [50, 90, 40],\n \"1,23\": [0, -90, 0],\n \"1,24\": [0, -90, -180],\n \"2,3\": [0, 180, 90],\n \"2,4\": [-90, 0, 90],\n \"2,5\": [90, 0, 90],\n \"2,6\": [-50, 90, -40],\n \"2,7\": [180, 0, 90],\n \"2,8\": [90, 0, -90],\n \"2,9\": [-90, 0, -90],\n \"2,10\": [130, 90, -40],\n \"2,11\": [0, -90, 0],\n \"2,12\": [0, -90, 180],\n \"2,13\": [0, -180, 0],\n \"2,14\": [-180, 0, 0],\n \"2,15\": [0, 0, -90],\n \"2,16\": [90, 0, 0],\n \"2,17\": [-90, 0, -180],\n \"2,18\": [-50, -90, 40],\n \"2,19\": [0, 0, 90],\n \"2,20\": [-90, 0, 0],\n \"2,21\": [-90, -180, 0],\n \"2,22\": [130, -90, 40],\n \"2,23\": [0, 90, -180],\n \"2,24\": [0, 90, 0],\n \"3,4\": [0, 90, -180],\n \"3,5\": [0, -90, 180],\n \"3,6\": [-90, 0, -180],\n \"3,7\": [0, 0, 180],\n \"3,8\": [0, -90, 0],\n \"3,9\": [0, 90, 0],\n \"3,10\": [-90, 0, 0],\n \"3,11\": [90, 0, -90],\n \"3,12\": [90, 0, 90],\n \"3,13\": [0, 0, -90],\n \"3,14\": [0, 0, 90],\n \"3,15\": [0, 180, 0],\n \"3,16\": [45, -90, 135],\n \"3,17\": [-135, 90, 45],\n \"3,18\": [90, 0, 0],\n \"3,19\": [-180, 0, 0],\n \"3,20\": [45, 90, 45],\n \"3,21\": [45, -90, -45],\n \"3,22\": [-90, 180, 0],\n \"3,23\": [-90, 0, 90],\n \"3,24\": [-90, 0, -90],\n \"4,5\": [0, 180, 0],\n \"4,6\": [90, 0, -90],\n \"4,7\": [0, 90, 0],\n \"4,8\": [180, 0, 0],\n \"4,9\": [0, 0, -180],\n \"4,10\": [90, 0, 90],\n \"4,11\": [-90, 0, 180],\n \"4,12\": [-90, 0, 0],\n \"4,13\": [-40, 90, 130],\n \"4,14\": [-40, 90, -50],\n \"4,15\": [0, -90, -180],\n \"4,16\": [-180, 0, 90],\n \"4,17\": [0, 0, 90],\n \"4,18\": [-90, 0, -90],\n \"4,19\": [0, -90, 0],\n \"4,20\": [0, 0, -90],\n \"4,21\": [0, 180, 90],\n \"4,22\": [-90, 0, 90],\n \"4,23\": [-90, 180, 0],\n \"4,24\": [90, 0, 0],\n \"5,6\": [90, 0, 90],\n \"5,7\": [0, -90, 0],\n \"5,8\": [0, 0, 180],\n \"5,9\": [180, 0, 0],\n \"5,10\": [90, 0, -90],\n \"5,11\": [-90, 0, 0],\n \"5,12\": [90, 180, 0],\n \"5,13\": [40, -90, 130],\n \"5,14\": [40, -90, -50],\n \"5,15\": [0, 90, 180],\n \"5,16\": [0, 0, -90],\n \"5,17\": [180, 0, -90],\n \"5,18\": [-90, 0, 90],\n \"5,19\": [0, 90, 0],\n \"5,20\": [0, 180, -90],\n \"5,21\": [0, 0, 90],\n \"5,22\": [-90, 0, -90],\n \"5,23\": [90, 0, 0],\n \"5,24\": [90, 0, -180],\n \"6,7\": [-90, 0, 0],\n \"6,8\": [45, 90, 45],\n \"6,9\": [45, -90, -45],\n \"6,10\": [0, 0, -180],\n \"6,11\": [0, 180, -90],\n \"6,12\": [-180, 0, -90],\n \"6,13\": [-90, 0, 90],\n \"6,14\": [-90, 0, -90],\n \"6,15\": [90, 0, 0],\n \"6,16\": [0, 90, -180],\n \"6,17\": [0, -90, -180],\n \"6,18\": [0, -180, 0],\n \"6,19\": [-90, -180, 0],\n \"6,20\": [0, -90, 0],\n \"6,21\": [0, 90, 0],\n \"6,22\": [-180, 0, 0],\n \"6,23\": [0, 0, -90],\n \"6,24\": [0, 0, 90],\n \"7,8\": [0, 90, 180],\n \"7,9\": [0, -90, -180],\n \"7,10\": [90, 0, -180],\n \"7,11\": [-90, 0, 90],\n \"7,12\": [-90, 0, -90],\n \"7,13\": [0, 0, 90],\n \"7,14\": [0, 0, -90],\n \"7,15\": [180, 0, 0],\n \"7,16\": [-45, 90, -45],\n \"7,17\": [-45, -90, 45],\n \"7,18\": [90, -180, 0],\n \"7,19\": [0, 180, 0],\n \"7,20\": [135, -90, 45],\n \"7,21\": [135, 90, -45],\n \"7,22\": [-90, 0, 0],\n \"7,23\": [90, 0, -90],\n \"7,24\": [90, 0, 90],\n \"8,9\": [0, -180, 0],\n \"8,10\": [-90, 0, 90],\n \"8,11\": [-90, -180, 0],\n \"8,12\": [90, 0, 0],\n \"8,13\": [-40, 90, -50],\n \"8,14\": [-40, 90, 130],\n \"8,15\": [0, -90, 0],\n \"8,16\": [0, 0, 90],\n \"8,17\": [0, -180, -90],\n \"8,18\": [90, 0, -90],\n \"8,19\": [0, -90, -180],\n \"8,20\": [-180, 0, -90],\n \"8,21\": [0, 0, -90],\n \"8,22\": [90, 0, 90],\n \"8,23\": [-90, 0, -180],\n \"8,24\": [-90, 0, 0],\n \"9,10\": [-90, 0, -90],\n \"9,11\": [90, 0, 0],\n \"9,12\": [90, 0, 180],\n \"9,13\": [40, -90, -50],\n \"9,14\": [40, -90, 130],\n \"9,15\": [0, 90, 0],\n \"9,16\": [0, -180, 90],\n \"9,17\": [0, 0, -90],\n \"9,18\": [90, 0, 90],\n \"9,19\": [0, 90, -180],\n \"9,20\": [0, 0, 90],\n \"9,21\": [180, 0, 90],\n \"9,22\": [90, 0, -90],\n \"9,23\": [-90, 0, 0],\n \"9,24\": [90, -180, 0],\n \"10,11\": [180, 0, -90],\n \"10,12\": [0, -180, -90],\n \"10,13\": [90, 0, -90],\n \"10,14\": [90, 0, 90],\n \"10,15\": [90, 180, 0],\n \"10,16\": [0, -90, 0],\n \"10,17\": [0, 90, 0],\n \"10,18\": [180, 0, 0],\n \"10,19\": [-90, 0, 0],\n \"10,20\": [0, 90, 180],\n \"10,21\": [0, -90, -180],\n \"10,22\": [0, 180, 0],\n \"10,23\": [0, 0, 90],\n \"10,24\": [0, 0, -90],\n \"11,12\": [0, 0, 180],\n \"11,13\": [0, -90, 0],\n \"11,14\": [0, -90, 180],\n \"11,15\": [-50, 90, -40],\n \"11,16\": [90, 0, -90],\n \"11,17\": [-90, 0, -90],\n \"11,18\": [0, 0, 90],\n \"11,19\": [130, 90, -40],\n \"11,20\": [-90, 0, 90],\n \"11,21\": [90, 0, 90],\n \"11,22\": [0, 0, -90],\n \"11,23\": [-180, 0, 0],\n \"11,24\": [0, -180, 0],\n \"12,13\": [0, 90, -180],\n \"12,14\": [0, 90, 0],\n \"12,15\": [-130, -90, -40],\n \"12,16\": [-90, 0, 90],\n \"12,17\": [90, 0, 90],\n \"12,18\": [0, 0, -90],\n \"12,19\": [50, -90, -40],\n \"12,20\": [90, 0, -90],\n \"12,21\": [-90, 0, -90],\n \"12,22\": [0, 0, 90],\n \"12,23\": [0, -180, 0],\n \"12,24\": [-180, 0, 0],\n \"13,14\": [0, 0, 180],\n \"13,15\": [0, 180, -90],\n \"13,16\": [90, 0, 180],\n \"13,17\": [-90, 0, 0],\n \"13,18\": [50, 90, 40],\n \"13,19\": [-180, 0, -90],\n \"13,20\": [90, -180, 0],\n \"13,21\": [90, 0, 0],\n \"13,22\": [-130, 90, 40],\n \"13,23\": [0, -90, 180],\n \"13,24\": [0, -90, 0],\n \"14,15\": [180, 0, -90],\n \"14,16\": [-90, 0, 0],\n \"14,17\": [-90, 180, 0],\n \"14,18\": [130, -90, 40],\n \"14,19\": [0, -180, -90],\n \"14,20\": [90, 0, 0],\n \"14,21\": [-90, 0, 180],\n \"14,22\": [-50, -90, 40],\n \"14,23\": [0, 90, 0],\n \"14,24\": [0, 90, -180],\n \"15,16\": [-45, 90, 135],\n \"15,17\": [-45, -90, -135],\n \"15,18\": [90, 0, 180],\n \"15,19\": [0, 0, 180],\n \"15,20\": [-45, -90, 45],\n \"15,21\": [-45, 90, -45],\n \"15,22\": [90, 0, 0],\n \"15,23\": [-90, 0, -90],\n \"15,24\": [-90, 0, 90],\n \"16,17\": [0, 180, 0],\n \"16,18\": [0, -90, -180],\n \"16,19\": [-90, 0, 90],\n \"16,20\": [180, 0, 0],\n \"16,21\": [0, 0, 180],\n \"16,22\": [0, -90, 0],\n \"16,23\": [40, 90, 50],\n \"16,24\": [40, 90, -130],\n \"17,18\": [0, 90, -180],\n \"17,19\": [-90, 0, -90],\n \"17,20\": [0, 0, 180],\n \"17,21\": [180, 0, 0],\n \"17,22\": [0, 90, 0],\n \"17,23\": [-40, -90, 50],\n \"17,24\": [-40, -90, -130],\n \"18,19\": [90, 0, 0],\n \"18,20\": [0, 90, 0],\n \"18,21\": [0, -90, 0],\n \"18,22\": [0, 0, 180],\n \"18,23\": [180, 0, 90],\n \"18,24\": [0, 180, 90],\n \"19,20\": [-135, 90, 45],\n \"19,21\": [-135, -90, -45],\n \"19,22\": [-90, 0, 180],\n \"19,23\": [90, 0, 90],\n \"19,24\": [90, 0, -90],\n \"20,21\": [0, 180, 0],\n \"20,22\": [0, -90, 180],\n \"20,23\": [40, 90, -130],\n \"20,24\": [40, 90, 50],\n \"21,22\": [0, 90, 180],\n \"21,23\": [-40, -90, -130],\n \"21,24\": [-40, -90, 50],\n \"22,23\": [0, -180, 90],\n \"22,24\": [-180, 0, 90],\n \"23,24\": [0, 0, -180]\n }\n },\n \"d30\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"6D1EB50D-67F2-45C7-BF93-23245B31E912\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-55.942420959472656,58.09579086303711,-56.76457214355469,-55.942420959472656,58.09579086303711,-56.76457214355469,-55.942420959472656,58.09579086303711,-56.76457214355469,-55.942420959472656,58.09579086303711,-56.76457214355469,-55.942420959472656,58.09579086303711,-56.76457214355469,-55.942420959472656,58.09579086303711,-56.76457214355469,-55.54539108276367,91.2035140991211,-2.153374433517456,-55.54539108276367,91.2035140991211,-2.153374433517456,-55.54539108276367,91.2035140991211,-2.153374433517456,-55.54539108276367,91.2035140991211,-2.153374433517456,-55.54539108276367,91.2035140991211,-2.153374433517456,58.09599685668945,56.76477813720703,55.94200897216797,58.09599685668945,56.76477813720703,55.94200897216797,58.09599685668945,56.76477813720703,55.94200897216797,58.09599685668945,56.76477813720703,55.94200897216797,58.09599685668945,56.76477813720703,55.94200897216797,-2.1539175510406494,-55.545379638671875,-91.20350646972656,-2.1539175510406494,-55.545379638671875,-91.20350646972656,-2.1539175510406494,-55.545379638671875,-91.20350646972656,-2.1539175510406494,-55.545379638671875,-91.20350646972656,-2.1539175510406494,-55.545379638671875,-91.20350646972656,-2.1539175510406494,-55.545379638671875,-91.20350646972656,35.903011322021484,1.3310145139694214,-91.8457260131836,35.903011322021484,1.3310145139694214,-91.8457260131836,35.903011322021484,1.3310145139694214,-91.8457260131836,35.903011322021484,1.3310145139694214,-91.8457260131836,35.903011322021484,1.3310145139694214,-91.8457260131836,35.903011322021484,1.3310145139694214,-91.8457260131836,33.74937438964844,-5.019184072807548e-7,-92.66828918457031,33.74937438964844,-5.019184072807548e-7,-92.66828918457031,33.74937438964844,-5.019184072807548e-7,-92.66828918457031,33.74937438964844,-5.019184072807548e-7,-92.66828918457031,35.903690338134766,1.331014633178711,91.84544372558594,35.903690338134766,1.331014633178711,91.84544372558594,35.903690338134766,1.331014633178711,91.84544372558594,35.903690338134766,1.331014633178711,91.84544372558594,35.903690338134766,1.331014633178711,91.84544372558594,56.76499557495117,55.94220733642578,58.0955924987793,56.76499557495117,55.94220733642578,58.0955924987793,56.76499557495117,55.94220733642578,58.0955924987793,56.76499557495117,55.94220733642578,58.0955924987793,56.76499557495117,55.94220733642578,58.0955924987793,-1.3306841850280762,-57.6989631652832,89.87248229980469,-1.3306841850280762,-57.6989631652832,89.87248229980469,-1.3306841850280762,-57.6989631652832,89.87248229980469,-1.3306841850280762,-57.6989631652832,89.87248229980469,-1.3306841850280762,-57.6989631652832,89.87248229980469,-1.3306841850280762,-57.6989631652832,89.87248229980469,92.66816711425781,33.749717712402344,-0.00033652668935246766,92.66816711425781,33.749717712402344,-0.00033652668935246766,92.66816711425781,33.749717712402344,-0.00033652668935246766,92.66816711425781,33.749717712402344,-0.00033652668935246766,0.0001248687185579911,92.66816711425781,33.74972152709961,0.0001248687185579911,92.66816711425781,33.74972152709961,0.0001248687185579911,92.66816711425781,33.74972152709961,0.0001248687185579911,92.66816711425781,33.74972152709961,-91.8455810546875,-35.903350830078125,1.3313559293746948,-91.8455810546875,-35.903350830078125,1.3313559293746948,-91.8455810546875,-35.903350830078125,1.3313559293746948,-91.8455810546875,-35.903350830078125,1.3313559293746948,-91.8455810546875,-35.903350830078125,1.3313559293746948,-91.8455810546875,-35.903350830078125,1.3313559293746948,-56.76499557495117,55.94220733642578,-58.095577239990234,-56.76499557495117,55.94220733642578,-58.095577239990234,-56.76499557495117,55.94220733642578,-58.095577239990234,-56.76499557495117,55.94220733642578,-58.095577239990234,-92.66815185546875,-33.749717712402344,0.000344159547239542,-92.66815185546875,-33.749717712402344,0.000344159547239542,-92.66815185546875,-33.749717712402344,0.000344159547239542,-92.66815185546875,-33.749717712402344,0.000344159547239542,-91.84559631347656,-35.903350830078125,-1.3306736946105957,-91.84559631347656,-35.903350830078125,-1.3306736946105957,-91.84559631347656,-35.903350830078125,-1.3306736946105957,-91.84559631347656,-35.903350830078125,-1.3306736946105957,-91.84559631347656,-35.903350830078125,-1.3306736946105957,-91.2037124633789,-2.1535837650299072,-55.54503631591797,-91.2037124633789,-2.1535837650299072,-55.54503631591797,-91.2037124633789,-2.1535837650299072,-55.54503631591797,-91.2037124633789,-2.1535837650299072,-55.54503631591797,-91.2037124633789,-2.1535837650299072,-55.54503631591797,1.3308831453323364,91.84559631347656,-35.90335464477539,1.3308831453323364,91.84559631347656,-35.90335464477539,1.3308831453323364,91.84559631347656,-35.90335464477539,1.3308831453323364,91.84559631347656,-35.90335464477539,1.3308831453323364,91.84559631347656,-35.90335464477539,55.545372009277344,91.2035140991211,-2.1537835597991943,55.545372009277344,91.2035140991211,-2.1537835597991943,55.545372009277344,91.2035140991211,-2.1537835597991943,55.545372009277344,91.2035140991211,-2.1537835597991943,55.545372009277344,91.2035140991211,-2.1537835597991943,55.545372009277344,91.2035140991211,-2.1537835597991943,-91.84558868408203,35.903350830078125,1.331355094909668,-91.84558868408203,35.903350830078125,1.331355094909668,-91.84558868408203,35.903350830078125,1.331355094909668,-91.84558868408203,35.903350830078125,1.331355094909668,-91.84558868408203,35.903350830078125,1.331355094909668,-91.84558868408203,35.903350830078125,1.331355094909668,-58.09558868408203,56.76477813720703,55.94243240356445,-58.09558868408203,56.76477813720703,55.94243240356445,-58.09558868408203,56.76477813720703,55.94243240356445,-58.09558868408203,56.76477813720703,55.94243240356445,-58.09558868408203,56.76477813720703,55.94243240356445,-57.698951721191406,89.87249755859375,1.3312309980392456,-57.698951721191406,89.87249755859375,1.3312309980392456,-57.698951721191406,89.87249755859375,1.3312309980392456,-57.698951721191406,89.87249755859375,1.3312309980392456,-55.54539108276367,-91.20350646972656,-2.1533758640289307,-55.54539108276367,-91.20350646972656,-2.1533758640289307,-55.54539108276367,-91.20350646972656,-2.1533758640289307,-55.54539108276367,-91.20350646972656,-2.1533758640289307,-55.54539108276367,-91.20350646972656,-2.1533758640289307,-55.545372009277344,91.2035140991211,2.1537914276123047,-55.545372009277344,91.2035140991211,2.1537914276123047,-55.545372009277344,91.2035140991211,2.1537914276123047,-55.545372009277344,91.2035140991211,2.1537914276123047,-55.545372009277344,91.2035140991211,2.1537914276123047,-55.545372009277344,91.2035140991211,2.1537914276123047,-55.545372009277344,91.2035140991211,2.1537914276123047,-55.9420051574707,58.09578323364258,56.764991760253906,-55.9420051574707,58.09578323364258,56.764991760253906,-55.9420051574707,58.09578323364258,56.764991760253906,-55.9420051574707,58.09578323364258,56.764991760253906,1.3308836221694946,-91.84559631347656,-35.90335464477539,1.3308836221694946,-91.84559631347656,-35.90335464477539,1.3308836221694946,-91.84559631347656,-35.90335464477539,1.3308836221694946,-91.84559631347656,-35.90335464477539,1.3308836221694946,-91.84559631347656,-35.90335464477539,-91.20330047607422,-2.153582811355591,55.54571533203125,-91.20330047607422,-2.153582811355591,55.54571533203125,-91.20330047607422,-2.153582811355591,55.54571533203125,-91.20330047607422,-2.153582811355591,55.54571533203125,-91.20330047607422,-2.153582811355591,55.54571533203125,-91.20330047607422,2.1535825729370117,55.54571533203125,-91.20330047607422,2.1535825729370117,55.54571533203125,-91.20330047607422,2.1535825729370117,55.54571533203125,-91.20330047607422,2.1535825729370117,55.54571533203125,-91.20330047607422,2.1535825729370117,55.54571533203125,-91.20330047607422,2.1535825729370117,55.54571533203125,-91.8456039428711,35.903350830078125,-1.3306739330291748,-91.8456039428711,35.903350830078125,-1.3306739330291748,-91.8456039428711,35.903350830078125,-1.3306739330291748,-91.8456039428711,35.903350830078125,-1.3306739330291748,-91.8456039428711,35.903350830078125,-1.3306739330291748,33.750057220458984,-3.255321701089997e-7,92.66802978515625,33.750057220458984,-3.255321701089997e-7,92.66802978515625,33.750057220458984,-3.255321701089997e-7,92.66802978515625,33.750057220458984,-3.255321701089997e-7,92.66802978515625,89.87269592285156,-1.3310151100158691,57.698638916015625,89.87269592285156,-1.3310151100158691,57.698638916015625,89.87269592285156,-1.3310151100158691,57.698638916015625,89.87269592285156,-1.3310151100158691,57.698638916015625,89.87269592285156,-1.3310151100158691,57.698638916015625,91.2037124633789,2.153581380844116,55.545047760009766,91.2037124633789,2.153581380844116,55.545047760009766,91.2037124633789,2.153581380844116,55.545047760009766,91.2037124633789,2.153581380844116,55.545047760009766,91.2037124633789,2.153581380844116,55.545047760009766,91.2037124633789,2.153581380844116,55.545047760009766,-35.903011322021484,1.3310145139694214,91.84571075439453,-35.903011322021484,1.3310145139694214,91.84571075439453,-35.903011322021484,1.3310145139694214,91.84571075439453,-35.903011322021484,1.3310145139694214,91.84571075439453,-35.903011322021484,1.3310145139694214,91.84571075439453,-35.903011322021484,-1.33101487159729,91.84571075439453,-35.903011322021484,-1.33101487159729,91.84571075439453,-35.903011322021484,-1.33101487159729,91.84571075439453,-35.903011322021484,-1.33101487159729,91.84571075439453,-35.903011322021484,-1.33101487159729,91.84571075439453,-33.74938201904297,-5.100424687043414e-7,92.66827392578125,-33.74938201904297,-5.100424687043414e-7,92.66827392578125,-33.74938201904297,-5.100424687043414e-7,92.66827392578125,-33.74938201904297,-5.100424687043414e-7,92.66827392578125,1.0764577388763428,55.84297561645508,-91.01956939697266,1.0764577388763428,55.84297561645508,-91.01956939697266,1.0764577388763428,55.84297561645508,-91.01956939697266,1.0764577388763428,55.84297561645508,-91.01956939697266,1.0764577388763428,55.84297561645508,-91.01956939697266,1.0764577388763428,55.84297561645508,-91.01956939697266,1.0764577388763428,55.84297561645508,-91.01956939697266,-0.00033518741838634014,55.17742919921875,-91.43085479736328,-0.00033518741838634014,55.17742919921875,-91.43085479736328,-0.00033518741838634014,55.17742919921875,-91.43085479736328,-0.00033518741838634014,55.17742919921875,-91.43085479736328,-0.00033518741838634014,55.17742919921875,-91.43085479736328,-0.00033518741838634014,55.17742919921875,-91.43085479736328,54.21428298950195,-92.02606964111328,-0.00019521401554811746,54.21428298950195,-92.02606964111328,-0.00019521401554811746,54.21428298950195,-92.02606964111328,-0.00019521401554811746,54.21428298950195,-92.02606964111328,-0.00019521401554811746,54.21428298950195,-92.02606964111328,-0.00019521401554811746,54.21428298950195,-92.02606964111328,-0.00019521401554811746,55.545372009277344,-91.20350646972656,-2.153782844543457,55.545372009277344,-91.20350646972656,-2.153782844543457,55.545372009277344,-91.20350646972656,-2.153782844543457,55.545372009277344,-91.20350646972656,-2.153782844543457,55.545372009277344,-91.20350646972656,-2.153782844543457,91.8455810546875,-35.903350830078125,-1.331348180770874,91.8455810546875,-35.903350830078125,-1.331348180770874,91.8455810546875,-35.903350830078125,-1.331348180770874,91.8455810546875,-35.903350830078125,-1.331348180770874,91.8455810546875,-35.903350830078125,-1.331348180770874,91.8455810546875,-35.903350830078125,-1.331348180770874,-54.21428298950195,92.02607727050781,0.00020320962357800454,-54.21428298950195,92.02607727050781,0.00020320962357800454,-54.21428298950195,92.02607727050781,0.00020320962357800454,-54.21428298950195,92.02607727050781,0.00020320962357800454,-54.21428298950195,92.02607727050781,0.00020320962357800454,-54.21428298950195,92.02607727050781,0.00020320962357800454,55.9420051574707,58.09579086303711,-56.76498031616211,55.9420051574707,58.09579086303711,-56.76498031616211,55.9420051574707,58.09579086303711,-56.76498031616211,55.9420051574707,58.09579086303711,-56.76498031616211,55.9420051574707,58.09579086303711,-56.76498031616211,57.69895935058594,89.87249755859375,1.3308056592941284,57.69895935058594,89.87249755859375,1.3308056592941284,57.69895935058594,89.87249755859375,1.3308056592941284,57.69895935058594,89.87249755859375,1.3308056592941284,57.69895935058594,89.87249755859375,1.3308056592941284,57.69895935058594,89.87249755859375,1.3308056592941284,57.69895935058594,89.87249755859375,1.3308056592941284,-1.330683946609497,57.698951721191406,89.87248229980469,-1.330683946609497,57.698951721191406,89.87248229980469,-1.330683946609497,57.698951721191406,89.87248229980469,-1.330683946609497,57.698951721191406,89.87248229980469,-1.330683946609497,57.698951721191406,89.87248229980469,1.3313459157943726,57.698951721191406,89.87246704101562,1.3313459157943726,57.698951721191406,89.87246704101562,1.3313459157943726,57.698951721191406,89.87246704101562,1.3313459157943726,57.698951721191406,89.87246704101562,1.3313459157943726,57.698951721191406,89.87246704101562,1.3313459157943726,57.698951721191406,89.87246704101562,-33.75006103515625,-3.2792155479910434e-7,-92.66804504394531,-33.75006103515625,-3.2792155479910434e-7,-92.66804504394531,-33.75006103515625,-3.2792155479910434e-7,-92.66804504394531,-33.75006103515625,-3.2792155479910434e-7,-92.66804504394531,1.3306846618652344,-57.69895935058594,-89.87250518798828,1.3306846618652344,-57.69895935058594,-89.87250518798828,1.3306846618652344,-57.69895935058594,-89.87250518798828,1.3306846618652344,-57.69895935058594,-89.87250518798828,1.3306846618652344,-57.69895935058594,-89.87250518798828,35.903011322021484,-1.33101487159729,-91.8457260131836,35.903011322021484,-1.33101487159729,-91.8457260131836,35.903011322021484,-1.33101487159729,-91.8457260131836,35.903011322021484,-1.33101487159729,-91.8457260131836,35.903011322021484,-1.33101487159729,-91.8457260131836,1.331345796585083,-57.6989631652832,89.87246704101562,1.331345796585083,-57.6989631652832,89.87246704101562,1.331345796585083,-57.6989631652832,89.87246704101562,1.331345796585083,-57.6989631652832,89.87246704101562,1.331345796585083,-57.6989631652832,89.87246704101562,1.331345796585083,-57.6989631652832,89.87246704101562,-58.09558868408203,-56.76478576660156,55.94243240356445,-58.09558868408203,-56.76478576660156,55.94243240356445,-58.09558868408203,-56.76478576660156,55.94243240356445,-58.09558868408203,-56.76478576660156,55.94243240356445,-55.9420051574707,-58.09579849243164,56.764991760253906,-55.9420051574707,-58.09579849243164,56.764991760253906,-55.9420051574707,-58.09579849243164,56.764991760253906,-55.9420051574707,-58.09579849243164,56.764991760253906,-55.9420051574707,-58.09579849243164,56.764991760253906,-89.87269592285156,1.3310145139694214,-57.69862365722656,-89.87269592285156,1.3310145139694214,-57.69862365722656,-89.87269592285156,1.3310145139694214,-57.69862365722656,-89.87269592285156,1.3310145139694214,-57.69862365722656,-89.87269592285156,1.3310145139694214,-57.69862365722656,-89.87269592285156,1.3310145139694214,-57.69862365722656,55.942420959472656,58.09578323364258,56.764583587646484,55.942420959472656,58.09578323364258,56.764583587646484,55.942420959472656,58.09578323364258,56.764583587646484,55.942420959472656,58.09578323364258,56.764583587646484,55.942420959472656,58.09578323364258,56.764583587646484,-0.00012307056749705225,-92.66816711425781,-33.749717712402344,-0.00012307056749705225,-92.66816711425781,-33.749717712402344,-0.00012307056749705225,-92.66816711425781,-33.749717712402344,-0.00012307056749705225,-92.66816711425781,-33.749717712402344,-1.3311455249786377,-91.84559631347656,-35.90334701538086,-1.3311455249786377,-91.84559631347656,-35.90334701538086,-1.3311455249786377,-91.84559631347656,-35.90334701538086,-1.3311455249786377,-91.84559631347656,-35.90334701538086,-1.3311455249786377,-91.84559631347656,-35.90334701538086,-1.3311455249786377,-91.84559631347656,-35.90334701538086,58.09599685668945,-56.76478576660156,55.94200897216797,58.09599685668945,-56.76478576660156,55.94200897216797,58.09599685668945,-56.76478576660156,55.94200897216797,58.09599685668945,-56.76478576660156,55.94200897216797,55.54539108276367,91.2035140991211,2.15338134765625,55.54539108276367,91.2035140991211,2.15338134765625,55.54539108276367,91.2035140991211,2.15338134765625,55.54539108276367,91.2035140991211,2.15338134765625,55.54539108276367,91.2035140991211,2.15338134765625,2.153247594833374,-55.545379638671875,-91.20352172851562,2.153247594833374,-55.545379638671875,-91.20352172851562,2.153247594833374,-55.545379638671875,-91.20352172851562,2.153247594833374,-55.545379638671875,-91.20352172851562,2.153247594833374,-55.545379638671875,-91.20352172851562,2.153247594833374,-55.545379638671875,-91.20352172851562,2.153247594833374,-55.545379638671875,-91.20352172851562,-0.0003373770450707525,-54.21428298950195,-92.02607727050781,-0.0003373770450707525,-54.21428298950195,-92.02607727050781,-0.0003373770450707525,-54.21428298950195,-92.02607727050781,-0.0003373770450707525,-54.21428298950195,-92.02607727050781,-0.0003373770450707525,-54.21428298950195,-92.02607727050781,-0.0003373770450707525,-54.21428298950195,-92.02607727050781,1.3311474323272705,91.84559631347656,35.90334701538086,1.3311474323272705,91.84559631347656,35.90334701538086,1.3311474323272705,91.84559631347656,35.90334701538086,1.3311474323272705,91.84559631347656,35.90334701538086,1.3311474323272705,91.84559631347656,35.90334701538086,54.21428298950195,92.02607727050781,-0.00019560271175578237,54.21428298950195,92.02607727050781,-0.00019560271175578237,54.21428298950195,92.02607727050781,-0.00019560271175578237,54.21428298950195,92.02607727050781,-0.00019560271175578237,54.21428298950195,92.02607727050781,-0.00019560271175578237,54.21428298950195,92.02607727050781,-0.00019560271175578237,-56.76456832885742,55.94220733642578,58.096012115478516,-56.76456832885742,55.94220733642578,58.096012115478516,-56.76456832885742,55.94220733642578,58.096012115478516,-56.76456832885742,55.94220733642578,58.096012115478516,-56.76456832885742,55.94220733642578,58.096012115478516,-56.76456832885742,55.94220733642578,58.096012115478516,-1.3308817148208618,91.84559631347656,35.90335464477539,-1.3308817148208618,91.84559631347656,35.90335464477539,-1.3308817148208618,91.84559631347656,35.90335464477539,-1.3308817148208618,91.84559631347656,35.90335464477539,-1.3308817148208618,91.84559631347656,35.90335464477539,-1.3308817148208618,91.84559631347656,35.90335464477539,-92.66816711425781,33.749717712402344,0.0003441836452111602,-92.66816711425781,33.749717712402344,0.0003441836452111602,-92.66816711425781,33.749717712402344,0.0003441836452111602,-92.66816711425781,33.749717712402344,0.0003441836452111602,-92.02587127685547,-3.414504305965238e-7,54.21462631225586,-92.02587127685547,-3.414504305965238e-7,54.21462631225586,-92.02587127685547,-3.414504305965238e-7,54.21462631225586,-92.02587127685547,-3.414504305965238e-7,54.21462631225586,-92.02587127685547,-3.414504305965238e-7,54.21462631225586,-92.02587127685547,-3.414504305965238e-7,54.21462631225586,-92.02587127685547,-3.414504305965238e-7,54.21462631225586,-89.87227630615234,-1.3310153484344482,57.69929885864258,-89.87227630615234,-1.3310153484344482,57.69929885864258,-89.87227630615234,-1.3310153484344482,57.69929885864258,-89.87227630615234,-1.3310153484344482,57.69929885864258,-89.87227630615234,-1.3310153484344482,57.69929885864258,-89.87227630615234,-1.3310153484344482,57.69929885864258,-56.76499557495117,-55.94221496582031,-58.095577239990234,-56.76499557495117,-55.94221496582031,-58.095577239990234,-56.76499557495117,-55.94221496582031,-58.095577239990234,-56.76499557495117,-55.94221496582031,-58.095577239990234,-89.87269592285156,-1.3310151100158691,-57.69862365722656,-89.87269592285156,-1.3310151100158691,-57.69862365722656,-89.87269592285156,-1.3310151100158691,-57.69862365722656,-89.87269592285156,-1.3310151100158691,-57.69862365722656,-89.87269592285156,-1.3310151100158691,-57.69862365722656,-91.2037124633789,2.1535816192626953,-55.54503631591797,-91.2037124633789,2.1535816192626953,-55.54503631591797,-91.2037124633789,2.1535816192626953,-55.54503631591797,-91.2037124633789,2.1535816192626953,-55.54503631591797,-91.2037124633789,2.1535816192626953,-55.54503631591797,-91.2037124633789,2.1535816192626953,-55.54503631591797,-57.6989631652832,-89.87248229980469,-1.3307993412017822,-57.6989631652832,-89.87248229980469,-1.3307993412017822,-57.6989631652832,-89.87248229980469,-1.3307993412017822,-57.6989631652832,-89.87248229980469,-1.3307993412017822,-57.6989631652832,-89.87248229980469,-1.3307993412017822,-57.6989631652832,-89.87248229980469,-1.3307993412017822,-57.69895553588867,-89.87248229980469,1.331230640411377,-57.69895553588867,-89.87248229980469,1.331230640411377,-57.69895553588867,-89.87248229980469,1.331230640411377,-57.69895553588867,-89.87248229980469,1.331230640411377,-57.69895553588867,-89.87248229980469,1.331230640411377,-57.69895553588867,-89.87248229980469,1.331230640411377,-57.69895553588867,-89.87248229980469,1.331230640411377,91.2037124633789,-2.1535840034484863,55.545047760009766,91.2037124633789,-2.1535840034484863,55.545047760009766,91.2037124633789,-2.1535840034484863,55.545047760009766,91.2037124633789,-2.1535840034484863,55.545047760009766,91.2037124633789,-2.1535840034484863,55.545047760009766,91.84559631347656,-35.903350830078125,1.3306814432144165,91.84559631347656,-35.903350830078125,1.3306814432144165,91.84559631347656,-35.903350830078125,1.3306814432144165,91.84559631347656,-35.903350830078125,1.3306814432144165,91.84559631347656,-35.903350830078125,1.3306814432144165,0.00033884088043123484,-54.21428298950195,92.02606964111328,0.00033884088043123484,-54.21428298950195,92.02606964111328,0.00033884088043123484,-54.21428298950195,92.02606964111328,0.00033884088043123484,-54.21428298950195,92.02606964111328,0.00033884088043123484,-54.21428298950195,92.02606964111328,0.00033884088043123484,-54.21428298950195,92.02606964111328,1.3311470746994019,-91.84559631347656,35.90334701538086,1.3311470746994019,-91.84559631347656,35.90334701538086,1.3311470746994019,-91.84559631347656,35.90334701538086,1.3311470746994019,-91.84559631347656,35.90334701538086,1.3311470746994019,-91.84559631347656,35.90334701538086,91.8456039428711,35.903350830078125,1.330681324005127,91.8456039428711,35.903350830078125,1.330681324005127,91.8456039428711,35.903350830078125,1.330681324005127,91.8456039428711,35.903350830078125,1.330681324005127,91.8456039428711,35.903350830078125,1.330681324005127,57.698951721191406,89.87249755859375,-1.3312232494354248,57.698951721191406,89.87249755859375,-1.3312232494354248,57.698951721191406,89.87249755859375,-1.3312232494354248,57.698951721191406,89.87249755859375,-1.3312232494354248,35.903690338134766,-1.331014633178711,91.84544372558594,35.903690338134766,-1.331014633178711,91.84544372558594,35.903690338134766,-1.331014633178711,91.84544372558594,35.903690338134766,-1.331014633178711,91.84544372558594,35.903690338134766,-1.331014633178711,91.84544372558594,35.903690338134766,-1.331014633178711,91.84544372558594,-56.76456832885742,-55.94221496582031,58.096012115478516,-56.76456832885742,-55.94221496582031,58.096012115478516,-56.76456832885742,-55.94221496582031,58.096012115478516,-56.76456832885742,-55.94221496582031,58.096012115478516,-56.76456832885742,-55.94221496582031,58.096012115478516,-56.76456832885742,-55.94221496582031,58.096012115478516,-2.1532464027404785,-55.545379638671875,91.20350646972656,-2.1532464027404785,-55.545379638671875,91.20350646972656,-2.1532464027404785,-55.545379638671875,91.20350646972656,-2.1532464027404785,-55.545379638671875,91.20350646972656,-2.1532464027404785,-55.545379638671875,91.20350646972656,0.00012470953515730798,-92.66816711425781,33.74972152709961,0.00012470953515730798,-92.66816711425781,33.74972152709961,0.00012470953515730798,-92.66816711425781,33.74972152709961,0.00012470953515730798,-92.66816711425781,33.74972152709961,-1.33088219165802,-91.84559631347656,35.90335464477539,-1.33088219165802,-91.84559631347656,35.90335464477539,-1.33088219165802,-91.84559631347656,35.90335464477539,-1.33088219165802,-91.84559631347656,35.90335464477539,-1.33088219165802,-91.84559631347656,35.90335464477539,-1.33088219165802,-91.84559631347656,35.90335464477539,-55.545372009277344,-91.20350646972656,2.153789758682251,-55.545372009277344,-91.20350646972656,2.153789758682251,-55.545372009277344,-91.20350646972656,2.153789758682251,-55.545372009277344,-91.20350646972656,2.153789758682251,56.76456832885742,-55.94221878051758,-58.09599304199219,56.76456832885742,-55.94221878051758,-58.09599304199219,56.76456832885742,-55.94221878051758,-58.09599304199219,56.76456832885742,-55.94221878051758,-58.09599304199219,92.66815185546875,-33.749717712402344,-0.0003363910655025393,92.66815185546875,-33.749717712402344,-0.0003363910655025393,92.66815185546875,-33.749717712402344,-0.0003363910655025393,92.66815185546875,-33.749717712402344,-0.0003363910655025393,91.20330047607422,-2.1535825729370117,-55.54570388793945,91.20330047607422,-2.1535825729370117,-55.54570388793945,91.20330047607422,-2.1535825729370117,-55.54570388793945,91.20330047607422,-2.1535825729370117,-55.54570388793945,91.20330047607422,-2.1535825729370117,-55.54570388793945,92.02587127685547,-3.892050415288395e-7,-54.2146110534668,92.02587127685547,-3.892050415288395e-7,-54.2146110534668,92.02587127685547,-3.892050415288395e-7,-54.2146110534668,92.02587127685547,-3.892050415288395e-7,-54.2146110534668,92.02587127685547,-3.892050415288395e-7,-54.2146110534668,92.02587127685547,-3.892050415288395e-7,-54.2146110534668,92.02587127685547,-3.892050415288395e-7,-54.2146110534668,0.0003386797325219959,54.21427536010742,92.02606964111328,0.0003386797325219959,54.21427536010742,92.02606964111328,0.0003386797325219959,54.21427536010742,92.02606964111328,0.0003386797325219959,54.21427536010742,92.02606964111328,0.0003386797325219959,54.21427536010742,92.02606964111328,0.0003386797325219959,54.21427536010742,92.02606964111328,2.1539180278778076,55.54536819458008,91.2034912109375,2.1539180278778076,55.54536819458008,91.2034912109375,2.1539180278778076,55.54536819458008,91.2034912109375,2.1539180278778076,55.54536819458008,91.2034912109375,91.20330047607422,2.153582811355591,-55.54570388793945,91.20330047607422,2.153582811355591,-55.54570388793945,91.20330047607422,2.153582811355591,-55.54570388793945,91.20330047607422,2.153582811355591,-55.54570388793945,91.20330047607422,2.153582811355591,-55.54570388793945,89.87227630615234,1.3310145139694214,-57.69927978515625,89.87227630615234,1.3310145139694214,-57.69927978515625,89.87227630615234,1.3310145139694214,-57.69927978515625,89.87227630615234,1.3310145139694214,-57.69927978515625,89.87227630615234,1.3310145139694214,-57.69927978515625,89.87227630615234,1.3310145139694214,-57.69927978515625,56.76456832885742,55.94220733642578,-58.09599304199219,56.76456832885742,55.94220733642578,-58.09599304199219,56.76456832885742,55.94220733642578,-58.09599304199219,56.76456832885742,55.94220733642578,-58.09599304199219,56.76456832885742,55.94220733642578,-58.09599304199219,58.09558868408203,56.76477813720703,-55.942420959472656,58.09558868408203,56.76477813720703,-55.942420959472656,58.09558868408203,56.76477813720703,-55.942420959472656,58.09558868408203,56.76477813720703,-55.942420959472656,55.54539108276367,-91.20350646972656,2.153383255004883,55.54539108276367,-91.20350646972656,2.153383255004883,55.54539108276367,-91.20350646972656,2.153383255004883,55.54539108276367,-91.20350646972656,2.153383255004883,55.54539108276367,-91.20350646972656,2.153383255004883,55.54539108276367,-91.20350646972656,2.153383255004883,91.84558868408203,35.903350830078125,-1.3313480615615845,91.84558868408203,35.903350830078125,-1.3313480615615845,91.84558868408203,35.903350830078125,-1.3313480615615845,91.84558868408203,35.903350830078125,-1.3313480615615845,91.84558868408203,35.903350830078125,-1.3313480615615845,91.84558868408203,35.903350830078125,-1.3313480615615845,-35.903690338134766,-1.331014633178711,-91.84546661376953,-35.903690338134766,-1.331014633178711,-91.84546661376953,-35.903690338134766,-1.331014633178711,-91.84546661376953,-35.903690338134766,-1.331014633178711,-91.84546661376953,-35.903690338134766,-1.331014633178711,-91.84546661376953,-35.903690338134766,-1.331014633178711,-91.84546661376953,-54.21428298950195,-92.02606964111328,0.00020284479251131415,-54.21428298950195,-92.02606964111328,0.00020284479251131415,-54.21428298950195,-92.02606964111328,0.00020284479251131415,-54.21428298950195,-92.02606964111328,0.00020284479251131415,-54.21428298950195,-92.02606964111328,0.00020284479251131415,-54.21428298950195,-92.02606964111328,0.00020284479251131415,-54.21428298950195,-92.02606964111328,0.00020284479251131415,-35.903690338134766,1.331014633178711,-91.84546661376953,-35.903690338134766,1.331014633178711,-91.84546661376953,-35.903690338134766,1.331014633178711,-91.84546661376953,-35.903690338134766,1.331014633178711,-91.84546661376953,-35.903690338134766,1.331014633178711,-91.84546661376953,89.87227630615234,-1.3310154676437378,-57.69927978515625,89.87227630615234,-1.3310154676437378,-57.69927978515625,89.87227630615234,-1.3310154676437378,-57.69927978515625,89.87227630615234,-1.3310154676437378,-57.69927978515625,89.87227630615234,-1.3310154676437378,-57.69927978515625,89.87227630615234,-1.3310154676437378,-57.69927978515625,55.942420959472656,-58.09579849243164,56.764583587646484,55.942420959472656,-58.09579849243164,56.764583587646484,55.942420959472656,-58.09579849243164,56.764583587646484,55.942420959472656,-58.09579849243164,56.764583587646484,55.942420959472656,-58.09579849243164,56.764583587646484,56.76499557495117,-55.94221496582031,58.0955924987793,56.76499557495117,-55.94221496582031,58.0955924987793,56.76499557495117,-55.94221496582031,58.0955924987793,56.76499557495117,-55.94221496582031,58.0955924987793,56.76499557495117,-55.94221496582031,58.0955924987793,2.1539194583892822,-55.545379638671875,91.2034912109375,2.1539194583892822,-55.545379638671875,91.2034912109375,2.1539194583892822,-55.545379638671875,91.2034912109375,2.1539194583892822,-55.545379638671875,91.2034912109375,2.1539194583892822,-55.545379638671875,91.2034912109375,2.1539194583892822,-55.545379638671875,91.2034912109375,-55.942420959472656,-58.09579849243164,-56.76457214355469,-55.942420959472656,-58.09579849243164,-56.76457214355469,-55.942420959472656,-58.09579849243164,-56.76457214355469,-55.942420959472656,-58.09579849243164,-56.76457214355469,-55.942420959472656,-58.09579849243164,-56.76457214355469,-55.942420959472656,-58.09579849243164,-56.76457214355469,-58.09599685668945,-56.76478576660156,-55.941993713378906,-58.09599685668945,-56.76478576660156,-55.941993713378906,-58.09599685668945,-56.76478576660156,-55.941993713378906,-58.09599685668945,-56.76478576660156,-55.941993713378906,92.0262680053711,-4.4363298457028577e-7,54.21394729614258,92.0262680053711,-4.4363298457028577e-7,54.21394729614258,92.0262680053711,-4.4363298457028577e-7,54.21394729614258,92.0262680053711,-4.4363298457028577e-7,54.21394729614258,92.0262680053711,-4.4363298457028577e-7,54.21394729614258,92.0262680053711,-4.4363298457028577e-7,54.21394729614258,55.9420051574707,-58.095802307128906,-56.76498031616211,55.9420051574707,-58.095802307128906,-56.76498031616211,55.9420051574707,-58.095802307128906,-56.76498031616211,55.9420051574707,-58.095802307128906,-56.76498031616211,55.9420051574707,-58.095802307128906,-56.76498031616211,55.9420051574707,-58.095802307128906,-56.76498031616211,58.09558868408203,-56.76478576660156,-55.942420959472656,58.09558868408203,-56.76478576660156,-55.942420959472656,58.09558868408203,-56.76478576660156,-55.942420959472656,58.09558868408203,-56.76478576660156,-55.942420959472656,58.09558868408203,-56.76478576660156,-55.942420959472656,89.87269592285156,1.3310145139694214,57.698638916015625,89.87269592285156,1.3310145139694214,57.698638916015625,89.87269592285156,1.3310145139694214,57.698638916015625,89.87269592285156,1.3310145139694214,57.698638916015625,89.87269592285156,1.3310145139694214,57.698638916015625,89.87269592285156,1.3310145139694214,57.698638916015625,57.6989631652832,-89.87248229980469,1.330806851387024,57.6989631652832,-89.87248229980469,1.330806851387024,57.6989631652832,-89.87248229980469,1.330806851387024,57.6989631652832,-89.87248229980469,1.330806851387024,57.6989631652832,-89.87248229980469,1.330806851387024,57.6989631652832,-89.87248229980469,1.330806851387024,57.69895553588867,-89.87248229980469,-1.3312231302261353,57.69895553588867,-89.87248229980469,-1.3312231302261353,57.69895553588867,-89.87248229980469,-1.3312231302261353,57.69895553588867,-89.87248229980469,-1.3312231302261353,57.69895553588867,-89.87248229980469,-1.3312231302261353,57.69895553588867,-89.87248229980469,-1.3312231302261353,-1.331344485282898,-57.69895935058594,-89.87249755859375,-1.331344485282898,-57.69895935058594,-89.87249755859375,-1.331344485282898,-57.69895935058594,-89.87249755859375,-1.331344485282898,-57.69895935058594,-89.87249755859375,-1.331344485282898,-57.69895935058594,-89.87249755859375,-92.0262680053711,-3.9587837363797007e-7,-54.21393585205078,-92.0262680053711,-3.9587837363797007e-7,-54.21393585205078,-92.0262680053711,-3.9587837363797007e-7,-54.21393585205078,-92.0262680053711,-3.9587837363797007e-7,-54.21393585205078,-92.0262680053711,-3.9587837363797007e-7,-54.21393585205078,-92.0262680053711,-3.9587837363797007e-7,-54.21393585205078,-58.09599685668945,56.76477813720703,-55.941993713378906,-58.09599685668945,56.76477813720703,-55.941993713378906,-58.09599685668945,56.76477813720703,-55.941993713378906,-58.09599685668945,56.76477813720703,-55.941993713378906,-58.09599685668945,56.76477813720703,-55.941993713378906,-57.69895935058594,89.87249755859375,-1.3307981491088867,-57.69895935058594,89.87249755859375,-1.3307981491088867,-57.69895935058594,89.87249755859375,-1.3307981491088867,-57.69895935058594,89.87249755859375,-1.3307981491088867,-57.69895935058594,89.87249755859375,-1.3307981491088867,-57.69895935058594,89.87249755859375,-1.3307981491088867,-57.69895935058594,89.87249755859375,-1.3307981491088867,-1.0771249532699585,55.84297561645508,-91.01956939697266,-1.0771249532699585,55.84297561645508,-91.01956939697266,-1.0771249532699585,55.84297561645508,-91.01956939697266,-1.0771249532699585,55.84297561645508,-91.01956939697266,-1.0771249532699585,55.84297561645508,-91.01956939697266,-1.0771249532699585,55.84297561645508,-91.01956939697266,0.6651760339736938,56.91976547241211,-90.35406494140625,0.6651760339736938,56.91976547241211,-90.35406494140625,0.6651760339736938,56.91976547241211,-90.35406494140625,0.6651760339736938,56.91976547241211,-90.35406494140625,0.6651760339736938,56.91976547241211,-90.35406494140625,-0.6658390760421753,56.91976547241211,-90.35406494140625,-0.6658390760421753,56.91976547241211,-90.35406494140625,-0.6658390760421753,56.91976547241211,-90.35406494140625,-0.6658390760421753,56.91976547241211,-90.35406494140625,-0.6658390760421753,56.91976547241211,-90.35406494140625,-1.3311461210250854,91.84559631347656,-35.90334701538086,-1.3311461210250854,91.84559631347656,-35.90334701538086,-1.3311461210250854,91.84559631347656,-35.90334701538086,-1.3311461210250854,91.84559631347656,-35.90334701538086,-1.3311461210250854,91.84559631347656,-35.90334701538086,-1.3311461210250854,91.84559631347656,-35.90334701538086,-0.00012322973634582013,92.66816711425781,-33.749717712402344,-0.00012322973634582013,92.66816711425781,-33.749717712402344,-0.00012322973634582013,92.66816711425781,-33.749717712402344,-0.00012322973634582013,92.66816711425781,-33.749717712402344,-89.87227630615234,1.3310145139694214,57.69929885864258,-89.87227630615234,1.3310145139694214,57.69929885864258,-89.87227630615234,1.3310145139694214,57.69929885864258,-89.87227630615234,1.3310145139694214,57.69929885864258,-2.153247833251953,55.54536819458008,91.20350646972656,-2.153247833251953,55.54536819458008,91.20350646972656,-2.153247833251953,55.54536819458008,91.20350646972656,-2.153247833251953,55.54536819458008,91.20350646972656],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-0.32300448417663574,0.7980563640594482,-0.5086984634399414,-0.3229999840259552,0.7980471849441528,-0.5087158679962158,-0.32299789786338806,0.7980540990829468,-0.5087060928344727,-0.3229975402355194,0.7980594038963318,-0.5086981654167175,-0.322995662689209,0.7980546951293945,-0.5087066292762756,-0.32297030091285706,0.7980630397796631,-0.5087097883224487,-0.3145313560962677,0.8124136924743652,-0.4909725487232208,-0.3145303428173065,0.8124191761016846,-0.4909641742706299,-0.31452667713165283,0.8123946189880371,-0.49100714921951294,-0.31452617049217224,0.8124018907546997,-0.49099525809288025,-0.31451353430747986,0.8124081492424011,-0.49099329113960266,0.7977177500724792,0.5067335963249207,0.3269055485725403,0.797724187374115,0.5067331790924072,0.3268907070159912,0.7977266907691956,0.5067335367202759,0.32688409090042114,0.797727644443512,0.5067120790481567,0.3269153833389282,0.7977277636528015,0.5067290663719177,0.3268887996673584,-0.48681509494781494,-0.3170761168003082,-0.8139249086380005,-0.486814022064209,-0.31705862283706665,-0.8139324188232422,-0.4868130683898926,-0.31705430150032043,-0.8139346241950989,-0.486799031496048,-0.3170582056045532,-0.8139415383338928,-0.48679620027542114,-0.31705963611602783,-0.8139426112174988,-0.4867938756942749,-0.3170706033706665,-0.8139398097991943,0.4910266399383545,0.2948715388774872,-0.8197216391563416,0.4910283386707306,0.29487162828445435,-0.8197205662727356,0.4910544753074646,0.29487064480781555,-0.8197053670883179,0.49105706810951233,0.2948714792728424,-0.8197034597396851,0.49106070399284363,0.2948935925960541,-0.8196933269500732,0.49107053875923157,0.29487308859825134,-0.8196947574615479,0.019486773759126663,0.0034609902650117874,-0.9998041391372681,0.01950395107269287,0.003431154415011406,-0.9998038411140442,0.01951080560684204,0.0034348517656326294,-0.9998037219047546,0.019518375396728516,0.003450945019721985,-0.9998035430908203,0.4929899275302887,0.2909228503704071,0.8199541568756104,0.4929942488670349,0.29094332456588745,0.8199442028999329,0.49299705028533936,0.29093438386917114,0.8199459314346313,0.49300453066825867,0.29094645380973816,0.8199370503425598,0.49301400780677795,0.29092937707901,0.8199374079704285,0.506730854511261,0.3268951177597046,0.7977238893508911,0.5067356824874878,0.32688724994659424,0.797724187374115,0.5067362189292908,0.3268929123878479,0.7977213859558105,0.5067363381385803,0.3269083499908447,0.7977150082588196,0.5067551732063293,0.32688796520233154,0.7977114319801331,-0.30085650086402893,-0.8039307594299316,0.5130113363265991,-0.3008539080619812,-0.8039156794548035,0.5130366683006287,-0.3008496165275574,-0.8039196729660034,0.5130329728126526,-0.30084699392318726,-0.8039218187332153,0.5130308866500854,-0.3008323013782501,-0.8039500713348389,0.5129954814910889,-0.3008321523666382,-0.8039198517799377,0.5130428671836853,0.999752938747406,0.022229939699172974,-0.000027254223823547363,0.9997531175613403,0.02221774309873581,0.000002555549144744873,0.9997531175613403,0.022219747304916382,-0.000011578202247619629,0.9997537136077881,0.022191841155290604,-0.000005044043064117432,-0.000006690621376037598,0.9997531771659851,0.022219300270080566,0.0000015208497643470764,0.9997526407241821,0.02224019356071949,0.000007711350917816162,0.9997531771659851,0.022218987345695496,0.000025779008865356445,0.9997528791427612,0.022229254245758057,-0.8199474215507507,-0.4929923415184021,0.29093796014785767,-0.8199467658996582,-0.49298861622810364,0.29094576835632324,-0.8199445605278015,-0.4929924011230469,0.2909456789493561,-0.8199410438537598,-0.4930053651332855,0.2909337878227234,-0.8199405670166016,-0.4929971694946289,0.29094862937927246,-0.8199316263198853,-0.4930025041103363,0.2909652292728424,-0.503142237663269,0.32643717527389526,-0.800179123878479,-0.503139078617096,0.3264300227165222,-0.8001841306686401,-0.5031341314315796,0.3264409899711609,-0.8001827001571655,-0.5031154155731201,0.32642847299575806,-0.800199568271637,-0.9997532367706299,-0.02221621572971344,-0.0000050961971282958984,-0.9997530579566956,-0.02221750095486641,0.000010980293154716492,-0.9997529983520508,-0.022224798798561096,-0.0000216066837310791,-0.9997526407241821,-0.022240420803427696,0.000005041249096393585,-0.8199519515037537,-0.4929916560649872,-0.29092633724212646,-0.8199494481086731,-0.4929870665073395,-0.29094117879867554,-0.8199440240859985,-0.4930054545402527,-0.29092511534690857,-0.8199396729469299,-0.4930015802383423,-0.29094383120536804,-0.8199336528778076,-0.4930025637149811,-0.29095908999443054,-0.8139479756355286,-0.48679518699645996,-0.3170475959777832,-0.8139445185661316,-0.4867909550666809,-0.31706294417381287,-0.8139359951019287,-0.4868128299713135,-0.3170514404773712,-0.8139359951019287,-0.4868128299713135,-0.3170514404773712,-0.8139272928237915,-0.4868120551109314,-0.3170749247074127,0.291377991437912,0.817572832107544,-0.4966624081134796,0.2913815379142761,0.817571222782135,-0.4966628849506378,0.29140985012054443,0.8175534605979919,-0.49667567014694214,0.29141905903816223,0.8175671696662903,-0.49664777517318726,0.2914317846298218,0.8175531625747681,-0.49666333198547363,0.3144916296005249,0.8124189376831055,-0.4909893870353699,0.314521849155426,0.812416136264801,-0.4909745156764984,0.31452593207359314,0.8124017119407654,-0.4909958243370056,0.31453219056129456,0.8123990893363953,-0.4909961223602295,0.31453219056129456,0.8123990893363953,-0.4909961223602295,0.31453603506088257,0.8124093413352966,-0.49097663164138794,-0.8199474215507507,0.4929920434951782,0.2909386157989502,-0.8199455142021179,0.4929906129837036,0.29094627499580383,-0.8199436664581299,0.492990642786026,0.29095107316970825,-0.8199414610862732,0.4929976165294647,0.2909456193447113,-0.8199408054351807,0.49300891160964966,0.290928453207016,-0.8199315071105957,0.4930025339126587,0.2909652292728424,-0.7977402210235596,0.5067192316055298,0.3268728256225586,-0.797728419303894,0.5067235827445984,0.3268952965736389,-0.7977269291877747,0.5067242383956909,0.32689791917800903,-0.7977257370948792,0.5067130923271179,0.3269180655479431,-0.7977219223976135,0.5067331790924072,0.32689642906188965,-0.8039276003837585,0.513014554977417,0.30085939168930054,-0.803920328617096,0.5130298733711243,0.30085256695747375,-0.8039193153381348,0.513033926486969,0.30084848403930664,-0.8039184808731079,0.5130314230918884,0.3008551299571991,-0.3170892596244812,-0.8139346837997437,-0.4867902398109436,-0.3170653283596039,-0.813935399055481,-0.48680463433265686,-0.3170589804649353,-0.8139439225196838,-0.4867946207523346,-0.3170560896396637,-0.8139365315437317,-0.486808717250824,-0.31703075766563416,-0.813947319984436,-0.4868071973323822,-0.3170735538005829,0.8139387965202332,0.4867936074733734,-0.31706538796424866,0.8139315843582153,0.48681098222732544,-0.3170650601387024,0.8139441609382629,0.4867902994155884,-0.31706249713897705,0.8139439225196838,0.4867921471595764,-0.3170546293258667,0.8139438629150391,0.4867975413799286,-0.31705403327941895,0.8139353394508362,0.4868120551109314,-0.31705284118652344,0.8139360547065735,0.4868115782737732,-0.32690656185150146,0.797716498374939,0.5067349672317505,-0.32688647508621216,0.7977249026298523,0.5067349076271057,-0.32688552141189575,0.7977311611175537,0.506725549697876,-0.3268853724002838,0.7977126240730286,0.5067547559738159,0.2909286618232727,-0.8199402689933777,-0.49300962686538696,0.290932297706604,-0.8199490904808044,-0.4929928183555603,0.290941059589386,-0.8199471831321716,-0.49299079179763794,0.2909466624259949,-0.8199383020401001,-0.49300238490104675,0.2909603714942932,-0.8199326395988464,-0.49300357699394226,-0.8139441013336182,-0.4867924749851227,0.31706178188323975,-0.8139419555664062,-0.4867969751358032,0.3170603811740875,-0.8139404058456421,-0.4868042469024658,0.31705325841903687,-0.8139353394508362,-0.48680993914604187,0.31705722212791443,-0.8139327764511108,-0.486809641122818,0.3170642554759979,-0.8139600157737732,0.48677366971969604,0.31704968214035034,-0.8139446973800659,0.4867933988571167,0.31705862283706665,-0.8139420747756958,0.48679694533348083,0.31706005334854126,-0.813937246799469,0.48679330945014954,0.3170780539512634,-0.8139326572418213,0.4868103265762329,0.3170636296272278,-0.8139210939407349,0.4868491590023041,0.31703364849090576,-0.8199512958526611,0.4929920434951782,-0.29092729091644287,-0.8199489712715149,0.4929892122745514,-0.2909389138221741,-0.8199403882026672,0.49300849437713623,-0.29093047976493835,-0.8199390172958374,0.4930011034011841,-0.2909468710422516,-0.8199335932731628,0.49300262331962585,-0.2909591794013977,0.022224154323339462,0.000008113682270050049,0.999752938747406,0.022224217653274536,-0.000007063150405883789,0.9997529983520508,0.02223508059978485,-0.00002683699131011963,0.9997528195381165,0.022243808954954147,0.0000014416873455047607,0.9997525811195374,0.5130226612091064,-0.30085763335227966,0.8039230704307556,0.5130249857902527,-0.30090412497520447,0.8039043545722961,0.5130347013473511,-0.3008493185043335,0.8039185404777527,0.5130426287651062,-0.30085936188697815,0.8039097785949707,0.5130426287651062,-0.30085936188697815,0.8039097785949707,0.8139259815216064,0.4868123233318329,0.31707778573036194,0.8139373064041138,0.4867918789386749,0.31708046793937683,0.8139375448226929,0.48680996894836426,0.3170512318611145,0.8139379024505615,0.4868050515651703,0.3170582354068756,0.8139469027519226,0.48679566383361816,0.3170495331287384,0.8139491677284241,0.48678889870643616,0.31705406308174133,-0.49300631880760193,0.29092955589294434,0.8199419379234314,-0.4929933547973633,0.29095086455345154,0.8199421167373657,-0.4929933547973633,0.29095086455345154,0.8199421167373657,-0.49299073219299316,0.2909349799156189,0.8199493885040283,-0.4929877817630768,0.290939062833786,0.8199498057365417,-0.49300646781921387,-0.29092955589294434,0.8199418783187866,-0.4929991066455841,-0.2909305989742279,0.8199458718299866,-0.4929991066455841,-0.2909305989742279,0.8199458718299866,-0.4929906129837036,-0.29093536734580994,0.8199493885040283,-0.49298787117004395,-0.2909401059150696,0.819949209690094,-0.022236576303839684,-0.0000014398247003555298,0.9997527003288269,-0.022226199507713318,0.000026732683181762695,0.9997529983520508,-0.022215761244297028,-0.000004159286618232727,0.9997531771659851,-0.022215470671653748,0.0000028014183044433594,0.9997532963752747,0.4860762059688568,0.31750911474227905,-0.8141976594924927,0.4860828220844269,0.3174929618835449,-0.8142000436782837,0.4860839545726776,0.31748220324516296,-0.8142036199569702,0.48609045147895813,0.31749191880226135,-0.8141958713531494,0.48609644174575806,0.31749197840690613,-0.8141922950744629,0.48610714077949524,0.3175130784511566,-0.8141777515411377,0.48611539602279663,0.31747305393218994,-0.8141883611679077,-0.0000346451997756958,0.016819089651107788,-0.9998586177825928,-0.00002047419548034668,0.016789883375167847,-0.999859094619751,-0.000013813376426696777,0.016806378960609436,-0.9998587369918823,-0.00000277138315141201,0.016810698434710503,-0.9998586773872375,0.0000065267086029052734,0.016805753111839294,-0.9998587965965271,0.000018220569472759962,0.016794271767139435,-0.9998589754104614,0.016185671091079712,-0.9998690485954285,-0.00003345310688018799,0.01620444655418396,-0.999868631362915,-0.0000010926742106676102,0.016207069158554077,-0.999868631362915,0.000011086463928222656,0.01620793342590332,-0.999868631362915,-0.000010415911674499512,0.016219258308410645,-0.9998684525489807,-2.980232238769531e-7,0.016219640150666237,-0.9998684525489807,-4.5890919864177704e-7,0.3170523941516876,-0.8139364719390869,-0.486811101436615,0.3170545697212219,-0.8139440417289734,-0.48679736256599426,0.31706172227859497,-0.8139370083808899,-0.48680418729782104,0.3170723617076874,-0.8139404058456421,-0.486791729927063,0.31707704067230225,-0.8139263391494751,-0.48681217432022095,0.8199406266212463,-0.4929971992969513,-0.29094862937927246,0.8199410438537598,-0.49300533533096313,-0.290933758020401,0.8199447989463806,-0.49299201369285583,-0.2909456193447113,0.8199467658996582,-0.4929884672164917,-0.290946364402771,0.819947361946106,-0.492992103099823,-0.2909383773803711,0.8199547529220581,-0.49298709630966187,-0.2909259796142578,-0.016219263896346092,0.9998684525489807,5.702022463083267e-7,-0.016217336058616638,0.9998685717582703,-4.023313522338867e-7,-0.016208097338676453,0.9998686909675598,-0.00001023709774017334,-0.016207024455070496,0.9998686909675598,0.000011369585990905762,-0.01620444655418396,0.9998686909675598,0.0000010926742106676102,-0.01616719365119934,0.9998693466186523,0.000033482909202575684,0.32295531034469604,0.7980619072914124,-0.5087209343910217,0.32295531034469604,0.7980619072914124,-0.5087209343910217,0.3229907155036926,0.798053503036499,-0.5087116956710815,0.3229965567588806,0.7980476021766663,-0.50871741771698,0.32300084829330444,0.7980570793151855,-0.5086997747421265,0.8039142489433289,0.5130448937416077,0.30084332823753357,0.8039181232452393,0.5130343437194824,0.3008510172367096,0.8039227724075317,0.5130297541618347,0.300846129655838,0.8039230108261108,0.5130389332771301,0.300830215215683,0.8039236664772034,0.5130265355110168,0.30084937810897827,0.8039326667785645,0.5130090117454529,0.3008555769920349,0.8039484024047852,0.512998104095459,0.3008320927619934,-0.30085283517837524,0.8039165735244751,0.5130358934402466,-0.300849586725235,0.8039194345474243,0.5130332708358765,-0.3008473813533783,0.803921639919281,0.5130310654640198,-0.3008348345756531,0.8039216995239258,0.5130383372306824,-0.3008311986923218,0.8039206862449646,0.5130419731140137,0.300837904214859,0.803917407989502,0.5130431056022644,0.30084890127182007,0.8039129972457886,0.5130437016487122,0.30085113644599915,0.803921639919281,0.5130288004875183,0.3008517622947693,0.8039230704307556,0.5130261182785034,0.3008546531200409,0.8039194941520691,0.5130301117897034,0.3008613586425781,0.8039342164993286,0.5130031108856201,-0.019525907933712006,0.0034512635320425034,-0.999803364276886,-0.019515730440616608,0.003434911370277405,-0.9998036623001099,-0.01951080560684204,0.0034344345331192017,-0.9998037815093994,-0.01949400082230568,0.003460988402366638,-0.9998040795326233,0.30084559321403503,-0.8039190173149109,-0.5130363702774048,0.3008456826210022,-0.8039130568504333,-0.5130454301834106,0.30084726214408875,-0.8039217591285706,-0.5130307674407959,0.30084937810897827,-0.8039229512214661,-0.5130279660224915,0.3008571267127991,-0.803926944732666,-0.5130170583724976,0.49298426508903503,-0.29092302918434143,-0.8199574947357178,0.4929867684841156,-0.290944904088974,-0.819948136806488,0.4929903745651245,-0.29092836380004883,-0.8199520111083984,0.4929988384246826,-0.29094645380973816,-0.819940447807312,0.4930066466331482,-0.29092955589294434,-0.8199417591094971,0.30083754658699036,-0.8039181232452393,0.5130423307418823,0.3008488714694977,-0.8039132356643677,0.5130434036254883,0.3008507788181305,-0.8039216995239258,0.5130287408828735,0.30085182189941406,-0.8039235472679138,0.5130254030227661,0.30085495114326477,-0.8039181232452393,0.5130321383476257,0.30085986852645874,-0.8039340376853943,0.5130043029785156,-0.797728419303894,-0.5067229270935059,0.3268962502479553,-0.7977258563041687,-0.506712794303894,0.3269183933734894,-0.797725260257721,-0.5067326426506042,0.3268887996673584,-0.7977154850959778,-0.5067335367202759,0.32691144943237305,-0.3269064426422119,-0.7977167367935181,0.5067347884178162,-0.3268938660621643,-0.7977226376533508,0.5067335367202759,-0.3268907070159912,-0.7977270483970642,0.5067287087440491,-0.3268868923187256,-0.7977240085601807,0.5067360997200012,-0.3268852233886719,-0.7977129817008972,0.5067545175552368,-0.5089601278305054,0.3034306466579437,-0.805536687374115,-0.5089573860168457,0.30343058705329895,-0.805538535118103,-0.5089519619941711,0.30339932441711426,-0.8055538535118103,-0.5089257955551147,0.30343857407569885,-0.8055554628372192,-0.5089184045791626,0.3034357726573944,-0.8055611252784729,-0.5088995695114136,0.30344462394714355,-0.8055697679519653,0.3268873393535614,0.7977280616760254,0.5067291259765625,0.32689282298088074,0.7977269887924194,0.5067273378372192,0.3269011378288269,0.7977209091186523,0.5067315101623535,0.3269102871417999,0.7977165579795837,0.5067325234413147,0.32691535353660583,0.7977278828620911,0.5067119002342224,-0.000026047229766845703,-0.999752938747406,-0.02222883701324463,-0.000008940696716308594,-0.9997531175613403,-0.022218912839889526,-0.0000015245750546455383,-0.9997526407241821,-0.02224019728600979,0.000007366761565208435,-0.9997531175613403,-0.02221873588860035,-0.290948748588562,-0.8199450969696045,-0.49298956990242004,-0.2909458875656128,-0.8199467658996582,-0.49298855662345886,-0.2909458577632904,-0.8199422955513,-0.4929962456226349,-0.29093700647354126,-0.8199491500854492,-0.4929898679256439,-0.29093021154403687,-0.8199409246444702,-0.4930077791213989,-0.2909247875213623,-0.8199558854103088,-0.4929860532283783,0.7977120280265808,-0.5067539215087891,0.32688847184181213,0.7977270483970642,-0.506733775138855,0.3268832564353943,0.7977273464202881,-0.5067236423492432,0.32689768075942993,0.7977273464202881,-0.5067236423492432,0.32689768075942993,0.3170563578605652,0.8139361143112183,0.48680925369262695,0.3170570433139801,0.8139445185661316,0.4867948889732361,0.3170689344406128,0.813934862613678,0.4868030846118927,0.3170716166496277,0.8139290809631348,0.4868110716342926,0.31707435846328735,0.8139417171478271,0.48678815364837646,0.4867840111255646,-0.3170663118362427,-0.8139473795890808,0.486789345741272,-0.3170621991157532,-0.8139458894729614,0.4867922365665436,-0.31707215309143066,-0.8139402270317078,0.48679348826408386,-0.317050039768219,-0.8139480948448181,0.4868071973323822,-0.3170592784881592,-0.8139362335205078,0.48680734634399414,-0.31705474853515625,-0.8139378428459167,0.4868084490299225,-0.3170764446258545,-0.8139288425445557,-0.000013574957847595215,-0.01111060380935669,-0.9999383091926575,-0.000004933535819873214,-0.011075659655034542,-0.9999386072158813,0.000007039896445348859,-0.011118302121758461,-0.9999381303787231,0.00000852346420288086,-0.01112416386604309,-0.9999381899833679,0.000014200806617736816,-0.011078417301177979,-0.9999385476112366,0.00003071129322052002,-0.011100709438323975,-0.9999383687973022,0.29092466831207275,0.8199556469917297,0.49298620223999023,0.2909298241138458,0.8199406862258911,0.4930081367492676,0.2909347116947174,0.8199495077133179,0.4929908514022827,0.2909448742866516,0.8199471235275269,0.49298879504203796,0.29094886779785156,0.8199383020401001,0.49300071597099304,0.016171813011169434,0.9998692274093628,-0.00003343820571899414,0.01620444655418396,0.999868631362915,-0.0000010915100574493408,0.01620711386203766,0.9998686909675598,-0.000010520219802856445,0.01620851457118988,0.9998686909675598,0.00001023709774017334,0.01621788740158081,0.9998685121536255,1.7881393432617188e-7,0.016219263896346092,0.9998685121536255,-3.4598633646965027e-7,-0.5067505836486816,0.3268905580043793,0.7977132201194763,-0.5067304372787476,0.3269084393978119,0.7977187037467957,-0.5067296028137207,0.3268975615501404,0.797723650932312,-0.5067266225814819,0.3268991708755493,0.7977248430252075,-0.5067264437675476,0.32688987255096436,0.7977288961410522,-0.5067263245582581,0.32689154148101807,0.7977282404899597,-0.2909603714942932,0.8199325203895569,0.49300387501716614,-0.2909455895423889,0.8199446797370911,0.4929923117160797,-0.2909436821937561,0.8199417591094971,0.4929981827735901,-0.2909405529499054,0.8199470639228821,0.4929913282394409,-0.2909325659275055,0.8199489712715149,0.4929928183555603,-0.2909291386604309,0.819939911365509,0.4930098354816437,-0.9997537136077881,0.022191839292645454,0.00000504031777381897,-0.9997531175613403,0.02221798151731491,-0.000002693384885787964,-0.9997531175613403,0.022219747304916382,0.000011652708053588867,-0.9997529983520508,0.022228829562664032,0.0000273287296295166,-0.9998690485954285,-0.00004357099533081055,0.01618865132331848,-0.999868631362915,8.069910109043121e-7,0.016208183020353317,-0.9998685717582703,-0.0000448375940322876,0.01621093973517418,-0.9998685717582703,-0.000008761882781982422,0.01621145009994507,-0.9998685717582703,0.000011309981346130371,0.01621215045452118,-0.9998684525489807,-0.0000010132789611816406,0.01622423529624939,-0.9998683929443359,0.0000010335352271795273,0.016223950311541557,-0.5130453705787659,-0.3008093237876892,0.8039266467094421,-0.5130453705787659,-0.3008093237876892,0.8039266467094421,-0.5130347013473511,-0.30084866285324097,0.8039188385009766,-0.5130272507667542,-0.3008646070957184,0.803917646408081,-0.5130270719528198,-0.3008405864238739,0.8039267659187317,-0.5130001902580261,-0.3008325397968292,0.8039469718933105,-0.5067576169967651,-0.3268996477127075,-0.7977050542831421,-0.5067576169967651,-0.3268996477127075,-0.7977050542831421,-0.5067268013954163,-0.3268904387950897,-0.7977283596992493,-0.5067136287689209,-0.32691413164138794,-0.7977270483970642,-0.5130422711372375,-0.30085960030555725,-0.8039097785949707,-0.5130422711372375,-0.30085960030555725,-0.8039097785949707,-0.5130351185798645,-0.3008493185043335,-0.8039183616638184,-0.5130186080932617,-0.30085819959640503,-0.8039255738258362,-0.5130038857460022,-0.3008323609828949,-0.8039445877075195,-0.8139479756355286,0.4867886006832123,-0.31705790758132935,-0.8139469027519226,0.4867956042289734,-0.3170493245124817,-0.8139386773109436,0.4867936074733734,-0.31707385182380676,-0.8139375448226929,0.48680996894836426,-0.3170512914657593,-0.8139374256134033,0.486805260181427,-0.3170590400695801,-0.8139272928237915,0.4868119955062866,-0.31707483530044556,-0.8039371967315674,-0.5130016803741455,-0.3008561134338379,-0.8039246797561646,-0.5130265951156616,-0.30084672570228577,-0.8039228916168213,-0.5130297541618347,-0.30084607005119324,-0.803920567035675,-0.5130411386489868,-0.3008330762386322,-0.803917407989502,-0.5130360126495361,-0.3008502721786499,-0.8039128184318542,-0.5130437016487122,-0.30084937810897827,-0.8039510250091553,-0.5129914879798889,0.30083632469177246,-0.803925633430481,-0.513030469417572,0.30083781480789185,-0.8039206862449646,-0.5130295753479004,0.3008521795272827,-0.8039200901985168,-0.5130325555801392,0.3008491098880768,-0.8039183616638184,-0.5130420923233032,0.30083730816841125,-0.8039169311523438,-0.513033390045166,0.3008556663990021,-0.8039165735244751,-0.5130240321159363,0.3008728623390198,0.8139259219169617,-0.4868123531341553,0.3170778751373291,0.8139362335205078,-0.48681262135505676,0.31705108284950256,0.8139362335205078,-0.48681262135505676,0.31705108284950256,0.8139456510543823,-0.4867914915084839,0.31705909967422485,0.8139479756355286,-0.4867952764034271,0.3170475363731384,0.8199337124824524,-0.4930025637149811,0.29095906019210815,0.8199397325515747,-0.4930015802383423,0.29094383120536804,0.8199440240859985,-0.4930053949356079,0.29092511534690857,0.8199495673179626,-0.49298688769340515,0.290941059589386,0.8199518918991089,-0.4929915964603424,0.29092657566070557,-0.000030502676963806152,-0.01617613434791565,0.9998691082000732,-0.000008180737495422363,-0.016205251216888428,0.999868631362915,0.0000011175870895385742,-0.01622094213962555,0.9998685121536255,0.0000046496279537677765,-0.01620444841682911,0.9998686909675598,0.000006626127287745476,-0.016218557953834534,0.9998685121536255,0.000016480684280395508,-0.016207247972488403,0.999868631362915,0.2909298837184906,-0.8199405670166016,0.493008553981781,0.2909371554851532,-0.819949209690094,0.49298959970474243,0.290944904088974,-0.8199470043182373,0.4929887652397156,0.29094886779785156,-0.8199384212493896,0.4930006265640259,0.29096388816833496,-0.8199325799942017,0.49300146102905273,0.8199388980865479,0.4930010437965393,0.2909468710422516,0.8199397325515747,0.4930093288421631,0.2909305691719055,0.8199490904808044,0.49298906326293945,0.2909387946128845,0.8199512362480164,0.4929920732975006,0.2909274697303772,0.8199567198753357,0.4929872155189514,0.29091987013816833,0.8039079904556274,0.5130425095558167,-0.30086418986320496,0.8039079904556274,0.5130425095558167,-0.30086418986320496,0.8039183616638184,0.513031542301178,-0.3008551597595215,0.8039308786392212,0.5130091905593872,-0.30085980892181396,0.4929937720298767,-0.29094550013542175,0.8199437856674194,0.4929945468902588,-0.2909424602985382,0.819944441318512,0.4929971694946289,-0.2909335792064667,0.8199460506439209,0.49299973249435425,-0.29094603657722473,0.8199400305747986,0.4930054247379303,-0.2909621000289917,0.819930911064148,0.4930139482021332,-0.2909294068813324,0.8199374079704285,-0.5067506432533264,-0.326890766620636,0.7977131605148315,-0.5067328214645386,-0.32690688967704773,0.797717809677124,-0.5067287087440491,-0.326896071434021,0.7977248430252075,-0.5067263841629028,-0.3268885314464569,0.7977295517921448,-0.5067260265350342,-0.3268907368183136,0.7977287173271179,-0.5067246556282043,-0.3268979489803314,0.7977266907691956,-0.4868078827857971,-0.31707385182380676,0.8139301538467407,-0.48680680990219116,-0.31705403327941895,0.8139384388923645,-0.4868009090423584,-0.3170638084411621,0.8139382600784302,-0.4867950677871704,-0.3170577883720398,0.8139441013336182,-0.486785888671875,-0.31707119941711426,0.8139443397521973,-0.0000063907355070114136,-0.9997531175613403,0.02221914753317833,0.0000015255063772201538,-0.9997526407241821,0.022240199148654938,0.000007659196853637695,-0.9997530579566956,0.022218987345695496,0.000025704503059387207,-0.9997528791427612,0.022229783236980438,-0.2909602224826813,-0.8199326992034912,0.49300363659858704,-0.2909456193447113,-0.8199447989463806,0.4929920732975006,-0.2909436523914337,-0.8199417591094971,0.4929981827735901,-0.2909403145313263,-0.8199471235275269,0.4929913580417633,-0.2909320592880249,-0.8199489116668701,0.4929931163787842,-0.2909291386604309,-0.8199397325515747,0.4930102229118347,-0.3170614242553711,-0.8139365911483765,0.4868052303791046,-0.3170546591281891,-0.8139438629150391,0.4867975413799286,-0.31705236434936523,-0.8139365911483765,0.4868110716342926,-0.31705206632614136,-0.8139435052871704,0.4867997169494629,0.5067088007926941,-0.32691431045532227,-0.7977301478385925,0.5067205429077148,-0.32689112424850464,-0.7977320551872253,0.506729781627655,-0.32688722014427185,-0.7977279424667358,0.5067307949066162,-0.32690852880477905,-0.797718346118927,0.9997526407241821,-0.022240418940782547,-0.000005042180418968201,0.9997529983520508,-0.02222476899623871,0.0000216066837310791,0.9997532367706299,-0.022217553108930588,-0.000011643394827842712,0.9997532963752747,-0.022216007113456726,0.0000049620866775512695,0.8139346837997437,-0.48679178953170776,-0.31708675622940063,0.8139352798461914,-0.48680993914604187,-0.31705716252326965,0.8139358758926392,-0.48680379986763,-0.31706541776657104,0.8139419555664062,-0.4867968261241913,-0.3170607388019562,0.8139616847038269,-0.4867711067199707,-0.3170492947101593,0.9998683333396912,9.019859135150909e-7,-0.016223222017288208,0.9998684525489807,-9.5367431640625e-7,-0.016224414110183716,0.999868631362915,-0.00000858306884765625,-0.01621215045452118,0.999868631362915,8.074566721916199e-7,-0.016208184882998466,0.999868631362915,0.000011593103408813477,-0.016211628913879395,0.9998686909675598,-0.000031620264053344727,-0.016208022832870483,0.9998689293861389,-0.00004826486110687256,-0.0161912702023983,-0.00000838935375213623,0.016203731298446655,0.9998688101768494,9.622890502214432e-7,0.01622016541659832,0.9998683929443359,0.000004648929461836815,0.01620445027947426,0.9998686909675598,0.0000064373016357421875,0.01621994376182556,0.9998685717582703,0.00001582503318786621,0.016208693385124207,0.9998685121536255,0.00003847479820251465,0.016177505254745483,0.999869167804718,0.48680007457733154,0.31705743074417114,0.813941240310669,0.48680129647254944,0.3170565962791443,0.8139409422874451,0.4868077337741852,0.3170599937438965,0.8139355778694153,0.48685207962989807,0.3170304000377655,0.8139206767082214,0.8139327168464661,0.48680904507637024,-0.31706565618515015,0.8139352798461914,0.48680996894836426,-0.3170573115348816,0.813941240310669,0.48680001497268677,-0.31705746054649353,0.8139423727989197,0.4867967665195465,-0.31705957651138306,0.8139436841011047,0.48679426312446594,-0.3170599341392517,0.5088772773742676,0.30341875553131104,-0.8055935502052307,0.5089110136032104,0.3034226894378662,-0.8055708408355713,0.5089132785797119,0.30345800518989563,-0.8055559992790222,0.5089139342308044,0.30345267057418823,-0.8055576086044312,0.508934497833252,0.30343055725097656,-0.8055529594421387,0.5089894533157349,0.303387314081192,-0.8055344820022583,0.5031076073646545,0.3264298439025879,-0.8002038598060608,0.5031241178512573,0.3264410197734833,-0.8001890182495117,0.5031249523162842,0.32645124197006226,-0.8001842498779297,0.5031318664550781,0.3264358937740326,-0.8001861572265625,0.5031365752220154,0.3264387249946594,-0.8001821041107178,0.797707200050354,0.506753146648407,-0.3269011378288269,0.797707200050354,0.506753146648407,-0.3269011378288269,0.7977266907691956,0.5067112445831299,-0.32691892981529236,0.7977287769317627,0.5067213773727417,-0.3268980383872986,0.3170560896396637,-0.8139365315437317,0.486808717250824,0.31705886125564575,-0.8139439821243286,0.48679447174072266,0.3170628845691681,-0.813936173915863,0.4868050217628479,0.3170718252658844,-0.8139439821243286,0.48678603768348694,0.31708014011383057,-0.8139369487762451,0.48679235577583313,0.31708040833473206,-0.8139251470565796,0.48681211471557617,0.8199315071105957,0.4930025637149811,-0.2909652590751648,0.8199403285980225,0.49300968647003174,-0.2909284830093384,0.8199413418769836,0.49299755692481995,-0.2909456491470337,0.8199435472488403,0.49299076199531555,-0.29095104336738586,0.8199455142021179,0.4929905831813812,-0.2909463047981262,0.8199475407600403,0.4929920434951782,-0.2909378409385681,-0.49301081895828247,-0.2909294068813324,-0.8199392557144165,-0.4930001497268677,-0.29094603657722473,-0.8199397325515747,-0.4929942190647125,-0.29094552993774414,-0.8199436664581299,-0.49299415946006775,-0.2909356355667114,-0.8199470043182373,-0.4929927885532379,-0.2909421920776367,-0.8199455738067627,-0.49299028515815735,-0.29092299938201904,-0.8199537992477417,-0.016219697892665863,-0.9998685121536255,1.8882565200328827e-7,-0.016219332814216614,-0.9998683929443359,4.917383193969727e-7,-0.016213014721870422,-0.9998685121536255,0.00004868209362030029,-0.016209125518798828,-0.999868631362915,-0.000010088086128234863,-0.016207367181777954,-0.999868631362915,0.000010952353477478027,-0.01620444655418396,-0.9998686909675598,-9.727664291858673e-7,-0.01618608832359314,-0.9998689889907837,0.00003844499588012695,-0.49107488989830017,0.2948729395866394,-0.8196921944618225,-0.49106675386428833,0.29489362239837646,-0.8196896314620972,-0.49106061458587646,0.2948709726333618,-0.8197014927864075,-0.49105924367904663,0.2948675751686096,-0.8197035193443298,-0.4910484552383423,0.2948729693889618,-0.8197080492973328,0.5130017399787903,-0.30085939168930054,-0.8039357662200928,0.5130244493484497,-0.30084937810897827,-0.803925096988678,0.513026773929596,-0.3008493483066559,-0.8039234280586243,0.513030469417572,-0.30085432529449463,-0.8039193749427795,0.5130401253700256,-0.30083391070365906,-0.8039209842681885,0.5130414366722107,-0.30084913969039917,-0.8039143681526184,0.32688838243484497,-0.7977268695831299,0.5067307949066162,0.3268934488296509,-0.797727644443512,0.5067262649536133,0.3268952965736389,-0.7977220416069031,0.5067338347434998,0.3269088566303253,-0.7977157235145569,0.5067347288131714,0.32691681385040283,-0.7977270483970642,0.5067120790481567,0.506731390953064,-0.3268928527832031,0.7977245450019836,0.5067368745803833,-0.3268938362598419,0.7977205514907837,0.5067563056945801,-0.3268866240978241,0.7977113723754883,0.5067574977874756,-0.3268994987010956,0.7977052927017212,0.5067574977874756,-0.3268994987010956,0.7977052927017212,0.48679232597351074,-0.31706538796424866,0.8139427304267883,0.4867943525314331,-0.3170838952064514,0.8139344453811646,0.48680126667022705,-0.317055344581604,0.8139413595199585,0.48680776357650757,-0.31706103682518005,0.8139351010322571,0.4868128001689911,-0.3170541524887085,0.813934862613678,0.4868144989013672,-0.3170735836029053,0.8139262199401855,-0.3269168436527252,-0.7977273464202881,-0.5067114233970642,-0.3269089162349701,-0.7977157235145569,-0.5067346096038818,-0.32690006494522095,-0.7977253198623657,-0.5067254304885864,-0.3268975615501404,-0.7977211475372314,-0.5067336559295654,-0.326894074678421,-0.7977250218391418,-0.5067296624183655,-0.32689133286476135,-0.7977280020713806,-0.5067267417907715,-0.7977375388145447,-0.5067383050918579,-0.3268502950668335,-0.7977375388145447,-0.5067383050918579,-0.3268502950668335,-0.7977255582809448,-0.5067352652549744,-0.326884001493454,-0.7977122068405151,-0.5067542791366577,-0.32688724994659424,0.9998685717582703,-1.9371509552001953e-7,0.016211718320846558,0.9998686909675598,-0.000007063150405883789,0.01620452105998993,0.9998686909675598,5.688052624464035e-7,0.01620963215827942,0.9998687505722046,8.088536560535431e-7,0.01620098017156124,0.9998687505722046,0.000009447336196899414,0.016203224658966064,0.9998690485954285,-0.000034227967262268066,0.01618596911430359,0.3268680274486542,-0.7977415323257446,-0.5067204236984253,0.3268900513648987,-0.7977254986763,-0.5067315697669983,0.32689306139945984,-0.7977262735366821,-0.5067285299301147,0.3268945813179016,-0.7977228164672852,-0.5067329406738281,0.32689517736434937,-0.7977268099784851,-0.5067262649536133,0.32691502571105957,-0.7977272272109985,-0.5067128539085388,0.7977112531661987,-0.5067529678344727,-0.32689201831817627,0.7977154850959778,-0.5067335963249207,-0.32691144943237305,0.7977215647697449,-0.506732702255249,-0.32689809799194336,0.7977254390716553,-0.5067287087440491,-0.32689452171325684,0.7977267503738403,-0.5067309141159058,-0.32688814401626587,0.5130077004432678,0.30085963010787964,0.8039320707321167,0.5130297541618347,0.30084937810897827,0.8039216995239258,0.5130323171615601,0.3008490204811096,0.8039200901985168,0.5130364894866943,0.30085432529449463,0.8039156794548035,0.5130462050437927,0.3008359372615814,0.8039162158966064,0.51304692029953,0.30084913969039917,0.8039107918739319,0.8039127588272095,-0.5130437612533569,0.30084940791130066,0.8039186596870422,-0.5130347609519958,0.3008493483066559,0.8039190769195557,-0.5130429863929749,0.30083420872688293,0.8039229512214661,-0.5130298137664795,0.30084604024887085,0.8039247393608093,-0.5130265951156616,0.3008466958999634,0.8039315938949585,-0.5130106210708618,0.3008553087711334,0.8039183616638184,-0.5130316615104675,-0.30085524916648865,0.803918719291687,-0.5130422711372375,-0.3008360266685486,0.8039200305938721,-0.5130326151847839,-0.30084913969039917,0.8039206862449646,-0.5130296349525452,-0.3008522093296051,0.8039317727088928,-0.513005793094635,-0.30086347460746765,0.8039458394050598,-0.5129998922348022,-0.3008357584476471,-0.30086222290992737,-0.8039306402206421,-0.5130082964897156,-0.30085277557373047,-0.8039199113845825,-0.513030469417572,-0.300851047039032,-0.8039217591285706,-0.513028621673584,-0.3008507788181305,-0.8039173483848572,-0.5130357146263123,-0.3008337914943695,-0.8039432168006897,-0.5130053162574768,-0.9998691082000732,-0.000034242868423461914,-0.01618131995201111,-0.9998687505722046,8.067581802606583e-7,-0.01620098017156124,-0.9998687505722046,0.000009641051292419434,-0.016203448176383972,-0.9998686909675598,-0.000007212162017822266,-0.016204625368118286,-0.9998686909675598,6.223563104867935e-7,-0.016209648922085762,-0.9998685121536255,-1.9371509552001953e-7,-0.01621153950691223,-0.7977283596992493,0.5067322254180908,-0.326882004737854,-0.7977277636528015,0.5067290663719177,-0.3268887996673584,-0.7977234125137329,0.5067338943481445,-0.32689157128334045,-0.7977177500724792,0.5067336559295654,-0.32690560817718506,-0.7977122068405151,0.5067541599273682,-0.326887309551239,-0.8039452433586121,0.5130032300949097,-0.3008318245410919,-0.8039326071739197,0.5130090713500977,-0.3008555769920349,-0.8039237856864929,0.5130265951156616,-0.30084937810897827,-0.8039227724075317,0.5130298137664795,-0.3008461892604828,-0.8039199709892273,0.5130324363708496,-0.30084940791130066,-0.8039199709892273,0.5130419135093689,-0.30083346366882324,-0.8039143681526184,0.5130447745323181,-0.30084335803985596,-0.4861213266849518,0.3174731433391571,-0.8141847252845764,-0.4861072897911072,0.3175134062767029,-0.8141775131225586,-0.4861047863960266,0.31748297810554504,-0.8141908049583435,-0.4861007332801819,0.3174685537815094,-0.8141988515853882,-0.4860859811306,0.31749480962753296,-0.8141974210739136,-0.48608478903770447,0.3174983561038971,-0.814196765422821,0.30044397711753845,0.8036642670631409,-0.5136703848838806,0.30044645071029663,0.8036598563194275,-0.5136758685112,0.3004480004310608,0.8036625981330872,-0.5136705636978149,0.3004538118839264,0.8036926984786987,-0.5136200785636902,0.30045652389526367,0.8036901950836182,-0.5136222839355469,-0.3004720211029053,0.8036836981773376,-0.5136234760284424,-0.30045682191848755,0.8036627769470215,-0.513664960861206,-0.3004477024078369,0.8036642670631409,-0.5136681795120239,-0.30044496059417725,0.8036916851997375,-0.5136268734931946,-0.3004448711872101,0.8036707043647766,-0.5136595964431763,-0.29143548011779785,0.8175532221794128,-0.4966612160205841,-0.2914249300956726,0.8175643086433411,-0.4966491460800171,-0.2914220690727234,0.8175652623176575,-0.49664899706840515,-0.2914113402366638,0.8175539374351501,-0.4966740012168884,-0.2913860082626343,0.8175709843635559,-0.49666067957878113,-0.2913796901702881,0.8175732493400574,-0.49666085839271545,-0.00002612173557281494,0.9997528791427612,-0.022229932248592377,-0.000007601454854011536,0.9997532367706299,-0.02221878245472908,0.0000013606622815132141,0.9997526407241821,-0.02224019542336464,0.000006318092346191406,0.9997531771659851,-0.022218704223632812,-0.5130420923233032,0.3008320927619934,0.8039203882217407,-0.5130420923233032,0.3008320927619934,0.8039203882217407,-0.513036847114563,0.30085039138793945,0.8039168119430542,-0.5130102634429932,0.3008587956428528,0.8039306998252869,-0.48680686950683594,0.31705421209335327,0.8139384388923645,-0.48680058121681213,0.31706511974334717,0.8139378428459167,-0.4867952764034271,0.3170567750930786,0.8139443397521973,-0.48679250478744507,0.3170604407787323,0.8139445781707764],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.01962309330701828,0.012889564037322998,0.02023136429488659,0.10979831218719482,0.07965327799320221,0.07732349634170532,0.07965327799320221,0.07732349634170532,0.02023136429488659,0.10979831218719482,0.5619750022888184,0.14709901809692383,0.02450018748641014,0.02645343542098999,0.06788178533315659,0.04795658588409424,0.0796533077955246,0.04795646667480469,0.02450018748641014,0.02645343542098999,0.503350019454956,0.1835920214653015,0.3125010132789612,0.3969320058822632,0.10002404451370239,0.04638880491256714,0.0839850902557373,0.04795658588409424,0.01962309330701828,0.008929312229156494,0.10002404451370239,0.04638880491256714,0.018139563500881195,0.03942161798477173,0.05488619580864906,0.04795628786087036,0.503491997718811,0.058592021465301514,0.09820473194122314,0.10979831218719482,0.05488619580864906,0.04795628786087036,0.018139563500881195,0.03942161798477173,0.04933025687932968,0.08043122291564941,0.04933025687932968,0.08043122291564941,0.03322688490152359,0.0800524353981018,0.03322688490152359,0.0800524353981018,0.0619719997048378,0.7201650142669678,0.012844499200582504,0.020931720733642578,0.5630499720573425,0.345100998878479,0.09606381505727768,0.008966565132141113,0.011493649333715439,0.020151853561401367,0.03200281038880348,0.0800524353981018,0.6875010132789612,0.5218279957771301,0.05055434629321098,0.07732337713241577,0.05055434629321098,0.07732337713241577,0.11814413964748383,0.008967041969299316,0.0850236713886261,0.029828131198883057,0.057423245161771774,0.008966565132141113,0.10158386081457138,0.04638880491256714,0.057423245161771774,0.008966565132141113,0.6874989867210388,0.5953599810600281,0.01827225834131241,0.008149445056915283,0.019623126834630966,0.045423686504364014,0.03755871579051018,0.047578275203704834,0.09387288242578506,0.07732349634170532,0.24622400104999542,0.4335950016975403,0.019623126834630966,0.045423686504364014,0.03755871579051018,0.047578275203704834,0.0850236713886261,0.040868282318115234,0.07398355007171631,0.008967041969299316,0.07532140612602234,0.08043128252029419,0.18750199675559998,0.5220270156860352,0.04066653922200203,0.04795628786087036,0.3125,0.021938025951385498,0.10997618734836578,0.10979831218719482,0.02358332648873329,0.01918947696685791,0.05190323293209076,0.046388089656829834,0.05190323293209076,0.046388089656829834,0.05488622561097145,0.08043128252029419,0.08367279171943665,0.023528218269348145,0.05488622561097145,0.08043128252029419,0.3124989867210388,0.5957159996032715,0.018272243440151215,0.013669490814208984,0.10554412007331848,0.008966803550720215,0.019007263705134392,0.10979831218719482,0.4383139908313751,0.39722001552581787,0.10253656655550003,0.10979831218719482,0.0503433421254158,0.04638814926147461,0.0850236713886261,0.024307966232299805,0.3124980032444,0.22047501802444458,0.10131248831748962,0.10979825258255005,0.10131248831748962,0.10979825258255005,0.0850236713886261,0.022748231887817383,0.05366211757063866,0.08043128252029419,0.1875,0.27190500497817993,0.10131251811981201,0.08043169975280762,0.02450021728873253,0.04338186979293823,0.06294332444667816,0.008966565132141113,0.1285640001296997,0.3085939884185791,0.02450021728873253,0.04338186979293823,0.09387288242578506,0.08043169975280762,0.09387288242578506,0.08043169975280762,0.006182555109262466,0.02567189931869507,0.027670973911881447,0.08005237579345703,0.312734991312027,0.34500598907470703,0.09387288242578506,0.10979831218719482,0.007099363952875137,0.04590404033660889,0.007099363952875137,0.04590404033660889,0.059218067675828934,0.08043104410171509,0.37151700258255005,0.3090599775314331,0.007099363952875137,0.04590404033660889,0.10997628420591354,0.07732337713241577,0.10997628420591354,0.07732337713241577,0.10253656655550003,0.07732349634170532,0.10253656655550003,0.07732349634170532,0.006182555109262466,0.020151853561401367,0.0625,0.14693999290466309,0.0625,0.2202470302581787,0.03322688490152359,0.07694470882415771,0.03378301486372948,0.04638814926147461,0.08502364158630371,0.013267934322357178,0.03378301486372948,0.04638814926147461,0.02598363533616066,0.024411678314208984,0.12137900292873383,0.1835939884185791,0.03378315269947052,0.008967041969299316,0.10253656655550003,0.04795682430267334,0.02450018748641014,0.030413687229156494,0.028895026072859764,0.047577083110809326,0.04622248187661171,0.07732313871383667,0.6290850043296814,0.1835920214653015,0.02450018748641014,0.030413687229156494,0.02450018748641014,0.0239296555519104,0.02450018748641014,0.0239296555519104,0.02450018748641014,0.0239296555519104,0.035342950373888016,0.008967041969299316,0.041890617460012436,0.07732313871383667,0.035342950373888016,0.008967041969299316,0.4962030053138733,0.3085950016975403,0.4375010132789612,0.27205002307891846,0.02333913929760456,0.07694411277770996,0.035342950373888016,0.04638814926147461,0.08367279171943665,0.012488067150115967,0.012844499200582504,0.024891972541809082,0.06232589855790138,0.047956228256225586,0.06232589855790138,0.047956228256225586,0.0883169174194336,0.07732337713241577,0.06249900162220001,0.47056400775909424,0.08087734878063202,0.10979831218719482,0.05190323293209076,0.00896763801574707,0.024500157684087753,0.03689777851104736,0.25286900997161865,0.5585929751396179,0.08087734878063202,0.10979831218719482,0.02598368003964424,0.038939595222473145,0.03322688490152359,0.047577738761901855,0.10997621715068817,0.04795706272125244,0.02598368003964424,0.038939595222473145,0.03322688490152359,0.047577738761901855,0.003621000098064542,0.1835939884185791,0.07794374972581863,0.008966684341430664,0.07794374972581863,0.008966684341430664,0.007533404976129532,0.020931720733642578,0.10131248831748962,0.07732349634170532,0.5625010132789612,0.5218250155448914,0.04933026805520058,0.07732349634170532,0.07532145082950592,0.04795658588409424,0.0850236713886261,0.028268277645111084,0.6875020265579224,0.2718750238418579,0.008582886308431625,0.03737819194793701,0.008582886308431625,0.03737819194793701,0.11658430099487305,0.04638892412185669,0.11106422543525696,0.00896674394607544,0.12150800228118896,0.3085930347442627,0.007099427282810211,0.03942000865936279,0.007099427282810211,0.03942000865936279,0.25360798835754395,0.4335930347442627,0.10002404451370239,0.00896674394607544,0.07242370396852493,0.046388447284698486,0.007099427282810211,0.03942000865936279,0.01857360079884529,0.019969403743743896,0.0462225005030632,0.10979831218719482,0.06249900162220001,0.5952410101890564,0.059218067675828934,0.04795658588409424,0.059218067675828934,0.04795658588409424,0.01857360079884529,0.018409550189971924,0.044998399913311005,0.10979831218719482,0.4374989867210388,0.09534800052642822,0.06690356880426407,0.008966684341430664,0.06690356880426407,0.008966684341430664,0.6874979734420776,0.34531301259994507,0.017222747206687927,0.01918947696685791,0.06846341490745544,0.008966624736785889,0.057993993163108826,0.04795658588409424,0.032921500504016876,0.10979831218719482,0.029636148363351822,0.019969403743743896,0.02364526502788067,0.10979831218719482,0.029636148363351822,0.019969403743743896,0.02364526502788067,0.10979831218719482,0.01326248049736023,0.04464298486709595,0.12177500128746033,0.6835950016975403,0.012804049998521805,0.04527390003204346,0.0372520349919796,0.10979831218719482,0.0372520349919796,0.10979831218719482,0.5033249855041504,0.3086329698562622,0.03230946138501167,0.10979831218719482,0.03230946138501167,0.10979831218719482,0.019623063504695892,0.032455623149871826,0.12873399257659912,0.6835910081863403,0.06665770709514618,0.10979819297790527,0.06354992836713791,0.07732325792312622,0.06354992836713791,0.07732325792312622,0.06665770709514618,0.10979819297790527,0.0031109999399632215,0.4335930347442627,0.06232583895325661,0.077323317527771,0.04066653922200203,0.08043086528778076,0.019623063504695892,0.030895769596099854,0.019623063504695892,0.030895769596099854,0.0635499358177185,0.08043128252029419,0.08367279171943665,0.018008112907409668,0.0635499358177185,0.08043128252029419,0.07098956406116486,0.04795658588409424,0.07098956406116486,0.04795658588409424,0.4375010132789612,0.5215610265731812,0.04066656902432442,0.0773230791091919,0.06665772199630737,0.047956645488739014,0.06665772199630737,0.047956645488739014,0.04066656902432442,0.0773230791091919,0.37138599157333374,0.0585939884185791,0.0235833041369915,0.02519160509109497,0.05921806022524834,0.10979831218719482,0.3133150041103363,0.27218103408813477,0.024563191458582878,0.08005183935165405,0.024563191458582878,0.08005183935165405,0.006182555109262466,0.014631807804107666,0.1068684309720993,0.10979831218719482,0.08398514240980148,0.07732337713241577,0.37139201164245605,0.4335950016975403,0.08398514240980148,0.07732337713241577,0.1068684309720993,0.10979831218719482,0.007099427282810211,0.04338020086288452,0.007099427282810211,0.04338020086288452,0.02333918772637844,0.047576963901519775,0.1056443378329277,0.07732349634170532,0.3787969946861267,0.3085930347442627,0.018139638006687164,0.02645343542098999,0.02333918772637844,0.047576963901519775,0.0558633916079998,0.046388328075408936,0.1068684458732605,0.07732337713241577,0.6207290291786194,0.4335950016975403,0.1068684458732605,0.07732337713241577,0.0558633916079998,0.046388328075408936,0.017222747206687927,0.02519160509109497,0.037558771669864655,0.08005297183990479,0.08367282897233963,0.04560840129852295,0.09698063135147095,0.08043169975280762,0.5630019903182983,0.2720860242843628,0.09054373949766159,0.008966386318206787,0.08831693977117538,0.047956764698028564,0.12188900262117386,0.4335950016975403,0.08831693977117538,0.047956764698028564,0.018139630556106567,0.03689777851104736,0.4375010132789612,0.14693796634674072,0.09450394660234451,0.008966565132141113,0.09450394660234451,0.008966565132141113,0.05055436119437218,0.08043122291564941,0.012844499200582504,0.01937192678451538,0.039303116500377655,0.008966505527496338,0.09264880418777466,0.07732337713241577,0.7453330159187317,0.4335939884185791,0.09264880418777466,0.07732337713241577,0.039303116500377655,0.008966505527496338,0.019623126834630966,0.043863773345947266,0.08087734878063202,0.08043140172958374,0.012844476848840714,0.01385188102722168,0.08831700682640076,0.08043140172958374,0.3125010132789612,0.5214719772338867,0.1875009983778,0.3970370292663574,0.08954101800918579,0.08043140172958374,0.08954101800918579,0.08043140172958374,0.03755873069167137,0.0769452452659607,0.011493649333715439,0.014631807804107666,0.07098963111639023,0.08043122291564941,0.07098963111639023,0.08043122291564941,0.10554413497447968,0.046388864517211914,0.10554413497447968,0.046388864517211914,0.49645400047302246,0.4340590238571167,0.025983694940805435,0.045423686504364014,0.05586344376206398,0.008966565132141113,0.08520916849374771,0.04795658588409424,0.08520916849374771,0.04795658588409424,0.5625010132789612,0.39734500646591187,0.01962309330701828,0.007369518280029297,0.011493649333715439,0.02567189931869507,0.04499842971563339,0.04795628786087036,0.18750199675559998,0.6470130085945129,0.06354992836713791,0.04795616865158081,0.08954101800918579,0.07732349634170532,0.04622248187661171,0.04795628786087036,0.08954101800918579,0.07732349634170532,0.04622248187661171,0.04795628786087036,0.012844499200582504,0.026451826095581055,0.6875010132789612,0.14722901582717896,0.024934161454439163,0.01444941759109497,0.04638303443789482,0.008966565132141113,0.11262404918670654,0.046388864517211914,0.6874989867210388,0.09525102376937866,0.5042709708213806,0.4335930347442627,0.1112002432346344,0.08043169975280762,0.08520916849374771,0.07732337713241577,0.008582878857851028,0.043862223625183105,0.008582878857851028,0.043862223625183105,0.01962309330701828,0.03737986087799072,0.08898389339447021,0.008966386318206787,0.01962309330701828,0.03737986087799072,0.09450394660234451,0.04638838768005371,0.08898389339447021,0.008966386318206787,0.4963819980621338,0.18359601497650146,0.01962309330701828,0.03737986087799072,0.09606381505727768,0.046388328075408936,0.6216750144958496,0.308555006980896,0.09698067605495453,0.10979819297790527,0.09698067605495453,0.10979819297790527,0.09606381505727768,0.046388328075408936,0.01962309330701828,0.038939714431762695,0.5624989867210388,0.46984195709228516,0.02493416890501976,0.0184096097946167,0.1112002432346344,0.10979825258255005,0.1112002432346344,0.10979825258255005,0.1068684458732605,0.04795706272125244,0.008582878857851028,0.04542207717895508,0.25361400842666626,0.0585939884185791,0.09264880418777466,0.10979819297790527,0.10997617989778519,0.08043175935745239,0.10997617989778519,0.08043175935745239,0.09264880418777466,0.10979819297790527,0.08502364158630371,0.01170814037322998,0.06250099837779999,0.5219460129737854,0.024563191458582878,0.07694411277770996,0.03200285881757736,0.07694464921951294,0.024563191458582878,0.07694411277770996,0.03200285881757736,0.07694464921951294,0.4374989867210388,0.3451380133628845,0.10564440488815308,0.04795706272125244,0.10564440488815308,0.04795706272125244,0.041890617460012436,0.04795628786087036,0.041890617460012436,0.04795628786087036,0.02493416890501976,0.019969403743743896,0.3125019967556,0.14671200513839722,0.0795036107301712,0.008966624736785889,0.11120033264160156,0.07732337713241577,0.007533404976129532,0.01937192678451538,0.02598368003964424,0.03737974166870117,0.37174901366233826,0.18359798192977905,0.02598368003964424,0.03737974166870117,0.05034333094954491,0.00896763801574707,0.11120033264160156,0.04795718193054199,0.05034333094954491,0.00896763801574707,0.11120033264160156,0.04795718193054199,0.04499838873744011,0.08043122291564941,0.49654099345207214,0.058596014976501465,0.07965327799320221,0.10979831218719482,0.023583341389894485,0.038159728050231934,0.023583341389894485,0.038159728050231934,0.023583341389894485,0.038159728050231934,0.06138351559638977,0.04638826847076416,0.5624989867210388,0.09532797336578369,0.05488619580864906,0.07732349634170532,0.007533375173807144,0.009891688823699951,0.061383482068777084,0.008966565132141113,0.621508002281189,0.058596014976501465,0.07221363484859467,0.08043122291564941,0.025983694940805435,0.043863773345947266,0.025983694940805435,0.043863773345947266,0.02450021728873253,0.04590564966201782,0.07794374972581863,0.04638850688934326,0.02450021728873253,0.04590564966201782,0.6215639710426331,0.5585950016975403,0.10710396617650986,0.046388864517211914,0.02450021728873253,0.04590564966201782,0.025983672589063644,0.030895769596099854,0.05366221442818642,0.10979831218719482,0.2464359998703003,0.3085939884185791,0.02767101861536503,0.047577083110809326,0.02767101861536503,0.047577083110809326,0.05366221442818642,0.10979831218719482,0.025983672589063644,0.032455503940582275,0.025983672589063644,0.032455503940582275,0.37213099002838135,0.5585950016975403,0.05488622561097145,0.10979831218719482,0.08831696212291718,0.10979831218719482,0.08831696212291718,0.10979831218719482,0.025983672589063644,0.032455503940582275,0.007099442183971405,0.03689616918563843,0.11262404918670654,0.00896674394607544,0.6286150217056274,0.058592021465301514,0.007099442183971405,0.03689616918563843,0.12366431206464767,0.046389102935791016,0.6875010132789612,0.021937012672424316,0.06232582405209541,0.08043128252029419,0.0850236713886261,0.017228126525878906,0.12366431206464767,0.00896763801574707,0.12366431206464767,0.00896763801574707,0.017222747206687927,0.04464375972747803,0.06846341490745544,0.04638838768005371,0.06846341490745544,0.04638838768005371,0.7464879751205444,0.30859601497650146,0.07532142847776413,0.077323317527771,0.07532142847776413,0.077323317527771,0.0850236713886261,0.033788442611694336,0.06788180023431778,0.08043128252029419,0.06788180023431778,0.08043128252029419,0.09264878183603287,0.04795682430267334,0.6875,0.3975909948348999,0.1068684309720993,0.08043169975280762,0.08367282897233963,0.04008835554122925,0.07242365181446075,0.008967041969299316,0.07242365181446075,0.008967041969299316,0.3124989867210388,0.4702550172805786,0.057993993163108826,0.08043110370635986,0.2463259994983673,0.18359601497650146,0.1056443527340889,0.10979831218719482,0.006182555109262466,0.044642090797424316,0.11658430099487305,0.008967041969299316,0.07654549926519394,0.04795658588409424,0.07654549926519394,0.04795658588409424,0.11658430099487305,0.008967041969299316,0.0625,0.2718600034713745,0.08367279171943665,0.029048264026641846,0.012844476848840714,0.015411734580993652,0.4375010132789612,0.02183997631072998,0.03633471950888634,0.0769452452659607,0.03633471950888634,0.0769452452659607,0.07965333014726639,0.08043140172958374,0.07965333014726639,0.08043140172958374,0.018139638006687164,0.04590564966201782,0.37845900654792786,0.058592021465301514,0.036334652453660965,0.047578275203704834,0.06690356880426407,0.04638850688934326,0.018139638006687164,0.04590564966201782,0.09698062390089035,0.07732349634170532,0.18749800324440002,0.7201740145683289,0.06665777415037155,0.08043122291564941,0.0850236713886261,0.03534823656082153,0.1874990016222,0.47015100717544556,0.09387288242578506,0.04795682430267334,0.09387288242578506,0.04795682430267334,0.09820473194122314,0.07732337713241577,0.09820473194122314,0.07732337713241577,0.08367279171943665,0.03456830978393555,0.08954101800918579,0.10979831218719482,0.09820473194122314,0.04795682430267334,0.12877599895000458,0.4335930347442627,0.02450018748641014,0.032937586307525635,0.012844454497098923,0.008331894874572754,0.08898389339447021,0.04638838768005371,0.08398512005805969,0.08043140172958374,0.4374989867210388,0.2202489972114563,0.18749800324440002,0.5951610207557678,0.0850236713886261,0.018788039684295654,0.07221363484859467,0.04795658588409424,0.12210442870855331,0.00896763801574707,0.007099363952875137,0.03041207790374756,0.4969879984855652,0.5585939884185791,0.0852091833949089,0.10979831218719482,0.07098958641290665,0.07732349634170532,0.007099363952875137,0.03041207790374756,0.0753214880824089,0.10979819297790527,0.07221363484859467,0.07732337713241577,0.07221363484859467,0.07732337713241577,0.24624399840831757,0.5585960149765015,0.0753214880824089,0.10979819297790527,0.008582886308431625,0.030893981456756592,0.008582886308431625,0.030893981456756592,0.05799401178956032,0.07732337713241577,0.05799401178956032,0.07732337713241577,0.6285120248794556,0.30859100818634033,0.04933030903339386,0.047956645488739014,0.04933030903339386,0.047956645488739014,0.01962307095527649,0.024411559104919434,0.018139563500881195,0.0239296555519104,0.05055434629321098,0.04795658588409424,0.057423245161771774,0.046388328075408936,0.7465599775314331,0.5585950016975403,0.02023131214082241,0.0475764274597168,0.1286740005016327,0.1835920214653015,0.008582886308431625,0.032453835010528564,0.07654549926519394,0.10979831218719482,0.02023131214082241,0.0475764274597168,0.007099427282810211,0.03293585777282715,0.007099427282810211,0.03293585777282715,0.019007263705134392,0.0475764274597168,0.007099427282810211,0.03293585777282715,0.04933033511042595,0.10979831218719482,0.0032250001095235348,0.6835929751396179,0.061973001807928085,0.647022008895874,0.01900731585919857,0.07694333791732788,0.02333913929760456,0.08005183935165405,0.01900731585919857,0.07694333791732788,0.007533375173807144,0.01385188102722168,0.05799407511949539,0.10979831218719482,0.1874990016222,0.22021400928497314,0.007533375173807144,0.015411734580993652,0.02023131214082241,0.07694333791732788,0.6296669840812683,0.4335930347442627,0.06788180023431778,0.10979831218719482,0.04482320323586464,0.04638856649398804,0.018139563500881195,0.032937586307525635,0.018139563500881195,0.032937586307525635,0.018139563500881195,0.032937586307525635,0.1875009983778,0.14697301387786865,0.0850236713886261,0.03930848836898804,0.1056443378329277,0.08043169975280762,0.1056443378329277,0.08043169975280762,0.07654549926519394,0.08043128252029419,0.07654549926519394,0.08043128252029419,0.0850236713886261,0.04638838768005371,0.07221363484859467,0.10979831218719482,0.07221363484859467,0.10979831218719482,0.09820473194122314,0.08043169975280762,0.09820473194122314,0.08043169975280762,0.5625010132789612,0.02186000347137451,0.044998399913311005,0.0773230791091919,0.09698063135147095,0.04795682430267334,0.023583319038152695,0.031675636768341064,0.044998399913311005,0.0773230791091919,0.09698063135147095,0.04795682430267334,0.24626600742340088,0.6835960149765015,0.023583319038152695,0.031675636768341064,0.0850236713886261,0.044828593730926514,0.437734991312027,0.46996796131134033,0.036334652453660965,0.08005297183990479,0.036334652453660965,0.08005297183990479,0.07098956406116486,0.10979831218719482,0.006182555109262466,0.031673967838287354,0.05055436119437218,0.10979831218719482,0.3786180019378662,0.1835920214653015,0.08398512005805969,0.10979831218719482,0.08398512005805969,0.10979831218719482,0.05055436119437218,0.10979831218719482,0.03930313140153885,0.04638850688934326,0.04482320323586464,0.008966565132141113,0.04482320323586464,0.008966565132141113,0.6875,0.4695960283279419,0.02358332648873329,0.013669490814208984,0.04086293280124664,0.04638850688934326,0.04086293280124664,0.04638850688934326,0.024934161454439163,0.012889564037322998,0.0625,0.3453270196914673,0.11106422543525696,0.04638880491256714,0.018139638006687164,0.04338186979293823,0.018139638006687164,0.04338186979293823,0.07654549926519394,0.07732349634170532,0.04086294770240784,0.008966505527496338,0.0034920000471174717,0.3085939884185791,0.018139638006687164,0.04338186979293823,0.007533375173807144,0.008331894874572754,0.6874989867210388,0.21995800733566284,0.05366221442818642,0.07732349634170532,0.028895026072859764,0.07694411277770996,0.05366221442818642,0.07732349634170532,0.028895026072859764,0.07694411277770996,0.06294332444667816,0.04638826847076416,0.1875,0.34528303146362305,0.027670973911881447,0.07694411277770996,0.006182555109262466,0.009111762046813965,0.07398355007171631,0.04638838768005371,0.12210451066493988,0.046389102935791016,0.12210451066493988,0.046389102935791016,0.12875600159168243,0.5585910081863403,0.07398355007171631,0.04638838768005371,0.006182555109262466,0.03815799951553345,0.06250099837779999,0.39662301540374756,0.0905437171459198,0.04638838768005371,0.040666673332452774,0.10979831218719482,0.040666673332452774,0.10979831218719482,0.0905437171459198,0.04638838768005371,0.012844454497098923,0.009891688823699951,0.011493615806102753,0.009111762046813965,0.4374989867210388,0.5956270098686218,0.08520913124084473,0.08043140172958374,0.08520913124084473,0.08043140172958374,0.04189063608646393,0.10979831218719482,0.008582908660173416,0.03893798589706421,0.11814413964748383,0.04638892412185669,0.6284400224685669,0.5585929751396179,0.10158386081457138,0.00896674394607544,0.10158386081457138,0.00896674394607544,0.11814413964748383,0.04638892412185669,0.06232590600848198,0.10979831218719482,0.04638301953673363,0.04638856649398804,0.04638301953673363,0.04638856649398804,0.7463849782943726,0.058596014976501465,0.06232590600848198,0.10979831218719482,0.01722273975610733,0.031675636768341064,0.04189063608646393,0.08043086528778076,0.04189063608646393,0.08043086528778076,0.0635499358177185,0.10979831218719482,0.3780120015144348,0.5585929751396179,0.018139611929655075,0.030413687229156494,0.018139611929655075,0.030413687229156494,0.017222747206687927,0.038159728050231934,0.08954101800918579,0.047956764698028564,0.7459149956703186,0.18359500169754028,0.05366213247179985,0.04795628786087036,0.017222747206687927,0.038159728050231934,0.023583341389894485,0.04464375972747803,0.25325098633766174,0.18358999490737915,0.0795036107301712,0.04638838768005371,0.10253656655550003,0.08043175935745239,0.10253656655550003,0.08043175935745239,0.0795036107301712,0.04638838768005371,0.08087733387947083,0.07732349634170532,0.10710396617650986,0.008966803550720215,0.10710396617650986,0.008966803550720215,0.5624989867210388,0.5953620076179504,0.01962309330701828,0.014449357986450195,0.025983653962612152,0.02597147226333618,0.025983653962612152,0.02597147226333618,0.10131251811981201,0.04795682430267334,0.5034360289573669,0.5585929751396179,0.08087733387947083,0.04795646667480469,0.08087733387947083,0.04795646667480469,0.10131251811981201,0.04795682430267334,0.37854599952697754,0.4331200122833252,0.01326248049736023,0.04590487480163574,0.019313467666506767,0.08005118370056152,0.03664000332355499,0.10979831218719482,0.019313467666506767,0.08005118370056152,0.029636148363351822,0.018707633018493652,0.25348299741744995,0.3081200122833252,0.02889440953731537,0.019728541374206543,0.024257240816950798,0.10979831218719482,0.02797701396048069,0.10979831218719482,0.02797701396048069,0.10979831218719482,0.02889440953731537,0.01894855499267578,0.028589049354195595,0.10979831218719482,0.621649980545044,0.18359601497650146,0.02889440953731537,0.01894855499267578,0.019925372675061226,0.08005118370056152,0.561972975730896,0.22008800506591797,0.02889503724873066,0.08005237579345703,0.02889503724873066,0.08005237579345703,0.007533404976129532,0.02645176649093628,0.06788178533315659,0.07732349634170532,0.06788178533315659,0.07732349634170532,0.007533404976129532,0.024891972541809082,0.06665770709514618,0.07732349634170532,0.3125,0.0952489972114563,0.09264882653951645,0.08043169975280762,0.0036299999337643385,0.5585929751396179,0.04622241482138634,0.08043122291564941,0.03200281038880348,0.047577738761901855,0.024500224739313126,0.03942161798477173,0.12137000262737274,0.5585950016975403,0.024563191458582878,0.047576963901519775,0.059218067675828934,0.07732349634170532,0.01962307095527649,0.025971412658691406],\n \"normalized\": false\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [28,234,182,303,269,285,521,391,482,142,593,355,209,84,89,440,512,467,168,146,454,320,118,222,535,280,109,40,32,563,488,479,398,419,273,186,541,74,78,326,69,331,240,435,295,473,26,178,626,53,309,51,436,448,96,97,103,255,422,45,5,618,615,65,508,264,284,376,373,315,160,632,550,126,237,254,61,366,499,344,348,165,408,414,557,201,576,506,431,365,329,95,140,145,406,36,578,572,486,16,302,296,72,59,68,158,163,169,177,179,603,62,594,0,393,48,489,352,350,76,543,346,534,378,197,437,528,417,42,480,477,212,613,173,607,230,223,635,595,102,111,555,432,556,494,507,232,86,289,218,314,121,100,244,30,27,407,252,259,304,55,325,157,147,374,396,11,154,14,270,41,271,279,122,330,129,341,522,281,525,624,82,621,427,421,387,199,447,438,495,260,511,80,313,85,573,552,560,501,426,429,43,410,258,187,389,420,248,424,390,493,445,465,347,540,77,411,131,251,462,474,481,12,565,155,150,283,372,490,217,392,587,71,66,386,402,144,161,453,634,58,363,367,94,597,141,277,238,125,3,600,8,136,319,98,300,498,233,17,538,345,324,202,115,394,548,49,318,220,119,33,456,143,335,56,128,39,225,460,91,336,134,198,567,575,361,537,107,383,166,416,404,562,35,189,123,192,211,174,610,116,101,120,208,397,478,515,559,434,226,321,221,306,311,54,620,612,614,369,257,253,291,554,235,139,586,327,245,524,531,268,216,287,569,520,484,23,513,243,622,204,625,1,604,64,545,379,439,592,263,356,509,181,231,25,184,172,297,242,293,503,276,272,405,526,151,159,337,164,28,298,234,303,227,269,521,247,391,142,598,593,209,608,84,468,464,451,450,444,470,168,384,146,320,117,118,535,581,280,40,461,32,488,463,479,419,505,273,541,360,74,326,585,69,240,514,435,473,472,26,626,206,53,51,547,436,96,137,97,255,430,422,5,10,618,65,602,508,284,570,376,315,628,160,550,191,126,254,130,61,499,18,344,165,338,408,557,441,201,358,106,364,110,502,370,185,195,487,194,577,485,239,583,292,579,21,290,79,584,357,354,265,351,46,250,529,533,381,413,616,609,175,457,458,635,458,230,635,112,207,9,6,596,113,219,400,90,87,308,288,371,549,152,153,561,148,396,215,11,631,135,342,132,332,340,200,443,446,496,349,261,81,627,310,574,193,553,504,418,425,47,415,409,190,483,388,246,44,423,492,50,449,347,343,540,412,339,127,466,469,476,15,38,564,150,527,283,491,399,213,588,75,70,385,530,403,162,171,452,60,73,359,93,105,601,275,580,236,2,590,599,133,630,317,299,19,497,20,582,536,323,52,205,395,156,544,316,633,224,34,459,455,333,67,57,37,266,229,92,328,334,196,377,571,362,542,539,382,170,167,401,149,566,188,274,124,210,475,176,114,104,99,208,88,397,516,442,558,228,307,322,305,286,312,619,83,611,368,428,256,294,433,551,138,353,589,249,518,523,267,13,214,568,282,519,22,471,517,623,7,203,4,617,606,546,375,380,591,63,262,510,605,180,24,31,183,301,29,241,500,108,278,405,532,526,159,629,337]\n },\n \"boundingSphere\": {\n \"center\": [0,0,-0.00000762939453125],\n \"radius\": 160.50603975869993\n }\n },\n faceValues: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30],\n rotationCombinations: {\n \"1,2\": [-58, -18, -148],\n \"1,3\": [122, -18, 32],\n \"1,4\": [-159, 30, -69],\n \"1,5\": [21, 150, -69],\n \"1,6\": [21, -30, 69],\n \"1,7\": [0, 90, -90],\n \"1,8\": [122, 18, -32],\n \"1,9\": [-58, 126, 32],\n \"1,10\": [58, 54, 148],\n \"1,11\": [-122, -18, -32],\n \"1,12\": [159, 30, 69],\n \"1,13\": [58, 54, -32],\n \"1,14\": [-58, 54, 32],\n \"1,15\": [90, 0, 90],\n \"1,16\": [-90, 0, -90],\n \"1,17\": [122, 54, 32],\n \"1,18\": [-122, 54, -32],\n \"1,19\": [-21, 30, 69],\n \"1,20\": [58, -18, -32],\n \"1,21\": [58, 126, -32],\n \"1,22\": [-58, 54, -148],\n \"1,23\": [-58, 18, -32],\n \"1,24\": [0, 90, 90],\n \"1,25\": [-21, 30, -111],\n \"1,26\": [21, 30, 111],\n \"1,27\": [-21, -150, -69],\n \"1,28\": [-58, -18, 32],\n \"1,29\": [58, 18, 32],\n \"1,30\": [-180, 0, 0],\n \"2,3\": [-21, 150, 69],\n \"2,4\": [-58, -126, -32],\n \"2,5\": [122, -54, -32],\n \"2,6\": [-58, 54, -148],\n \"2,7\": [-122, -54, 32],\n \"2,8\": [0, -180, 0],\n \"2,9\": [-159, -30, 69],\n \"2,10\": [-122, -18, -32],\n \"2,11\": [58, -18, 148],\n \"2,12\": [159, -30, -69],\n \"2,13\": [58, -162, -32],\n \"2,14\": [-58, -54, 148],\n \"2,15\": [-159, 30, -69],\n \"2,16\": [21, -30, 69],\n \"2,17\": [21, -150, 69],\n \"2,18\": [0, -90, 90],\n \"2,19\": [-58, -18, -148],\n \"2,20\": [58, 126, -32],\n \"2,21\": [0, -90, -90],\n \"2,22\": [-58, -54, -32],\n \"2,23\": [-21, -30, 111],\n \"2,24\": [58, -126, 32],\n \"2,25\": [-58, -18, 32],\n \"2,26\": [-90, 0, -90],\n \"2,27\": [122, 18, -32],\n \"2,28\": [0, 0, -180],\n \"2,29\": [58, 162, 32],\n \"2,30\": [-58, -162, 32],\n \"3,4\": [90, 0, -90],\n \"3,5\": [90, 0, 90],\n \"3,6\": [-90, 0, 90],\n \"3,7\": [122, 54, 32],\n \"3,8\": [21, 30, -69],\n \"3,9\": [58, 54, 148],\n \"3,10\": [0, 90, 90],\n \"3,11\": [122, -54, -32],\n \"3,12\": [58, 18, 32],\n \"3,13\": [0, 90, -90],\n \"3,14\": [159, 30, 69],\n \"3,15\": [-21, 30, 69],\n \"3,16\": [159, -30, -69],\n \"3,17\": [58, 54, -32],\n \"3,18\": [122, 18, -32],\n \"3,19\": [21, 150, -69],\n \"3,20\": [-58, 18, -32],\n \"3,21\": [-58, 162, -32],\n \"3,22\": [-21, 150, 69],\n \"3,23\": [180, 0, 0],\n \"3,24\": [-58, 126, 32],\n \"3,25\": [-159, 30, -69],\n \"3,26\": [58, 126, -32],\n \"3,27\": [21, -30, 69],\n \"3,28\": [-159, -30, 69],\n \"3,29\": [-58, 54, 32],\n \"3,30\": [58, -18, -32],\n \"4,5\": [0, 0, 180],\n \"4,6\": [180, 0, 0],\n \"4,7\": [-58, 18, 148],\n \"4,8\": [-58, -54, -32],\n \"4,9\": [-58, -18, -148],\n \"4,10\": [-90, 0, 90],\n \"4,11\": [58, 18, 32],\n \"4,12\": [-21, -30, 111],\n \"4,13\": [-90, 0, -90],\n \"4,14\": [-58, 54, -148],\n \"4,15\": [-122, -54, 32],\n \"4,16\": [58, 54, -32],\n \"4,17\": [-58, -18, 32],\n \"4,18\": [-21, 30, 69],\n \"4,19\": [-122, 54, -32],\n \"4,20\": [21, -150, 69],\n \"4,21\": [-21, 30, -111],\n \"4,22\": [-58, 54, 32],\n \"4,23\": [0, 90, 90],\n \"4,24\": [-58, 18, -32],\n \"4,25\": [58, 126, -32],\n \"4,26\": [-122, 18, 32],\n \"4,27\": [58, -54, -148],\n \"4,28\": [122, 54, 32],\n \"4,29\": [-122, -18, -32],\n \"4,30\": [21, -30, 69],\n \"5,6\": [0, 180, 0],\n \"5,7\": [58, -18, -32],\n \"5,8\": [58, 54, 148],\n \"5,9\": [58, 18, 32],\n \"5,10\": [90, 0, -90],\n \"5,11\": [-58, -18, -148],\n \"5,12\": [21, 30, -69],\n \"5,13\": [90, 0, 90],\n \"5,14\": [58, -54, 32],\n \"5,15\": [-58, 126, 32],\n \"5,16\": [-58, -54, 148],\n \"5,17\": [58, 18, -148],\n \"5,18\": [21, -30, -111],\n \"5,19\": [-58, -126, -32],\n \"5,20\": [159, 30, 69],\n \"5,21\": [21, -30, 69],\n \"5,22\": [58, -54, -148],\n \"5,23\": [0, -90, -90],\n \"5,24\": [58, -18, 148],\n \"5,25\": [122, -54, -32],\n \"5,26\": [-58, -162, 32],\n \"5,27\": [-58, 54, 32],\n \"5,28\": [58, -126, 32],\n \"5,29\": [-58, 162, -32],\n \"5,30\": [-21, 30, -111],\n \"6,7\": [-58, 162, -32],\n \"6,8\": [122, -54, -32],\n \"6,9\": [-58, -162, 32],\n \"6,10\": [90, 0, 90],\n \"6,11\": [-122, 18, 32],\n \"6,12\": [-21, -150, -69],\n \"6,13\": [90, 0, -90],\n \"6,14\": [-58, 126, 32],\n \"6,15\": [58, -54, 32],\n \"6,16\": [-122, 54, -32],\n \"6,17\": [122, -18, 32],\n \"6,18\": [159, 30, 69],\n \"6,19\": [58, 54, -32],\n \"6,20\": [21, -30, -111],\n \"6,21\": [-21, 150, 69],\n \"6,22\": [122, 54, 32],\n \"6,23\": [0, 90, -90],\n \"6,24\": [122, 18, -32],\n \"6,25\": [58, 54, 148],\n \"6,26\": [58, 18, 32],\n \"6,27\": [58, -126, 32],\n \"6,28\": [-58, 54, 32],\n \"6,29\": [58, -18, -32],\n \"6,30\": [-159, -30, 69],\n \"7,8\": [-58, 54, -148],\n \"7,9\": [-21, 30, 69],\n \"7,10\": [21, 30, -69],\n \"7,11\": [58, -126, 32],\n \"7,12\": [-58, 18, -32],\n \"7,13\": [21, 30, 111],\n \"7,14\": [21, -30, 69],\n \"7,15\": [0, 90, -90],\n \"7,16\": [0, -90, -90],\n \"7,17\": [-21, 30, -111],\n \"7,18\": [-21, -30, -69],\n \"7,19\": [58, -18, 148],\n \"7,20\": [122, 54, 32],\n \"7,21\": [-21, -30, 111],\n \"7,22\": [21, -30, -111],\n \"7,23\": [58, -54, 32],\n \"7,24\": [0, 0, 180],\n \"7,25\": [58, -18, -32],\n \"7,26\": [58, 18, -148],\n \"7,27\": [-122, 18, 32],\n \"7,28\": [-58, -126, -32],\n \"7,29\": [58, 54, 148],\n \"7,30\": [-90, 0, -90],\n \"8,9\": [-21, 30, -111],\n \"8,10\": [-58, 18, 148],\n \"8,11\": [122, 18, -32],\n \"8,12\": [21, 30, 111],\n \"8,13\": [-58, 18, -32],\n \"8,14\": [-122, 54, -32],\n \"8,15\": [-21, -30, 111],\n \"8,16\": [-21, 150, 69],\n \"8,17\": [-21, 30, 69],\n \"8,18\": [0, 90, 90],\n \"8,19\": [-122, 18, 32],\n \"8,20\": [-58, -54, -32],\n \"8,21\": [0, 90, -90],\n \"8,22\": [58, 126, -32],\n \"8,23\": [-159, 30, -69],\n \"8,24\": [-58, 54, 32],\n \"8,25\": [58, 162, 32],\n \"8,26\": [-90, 0, 90],\n \"8,27\": [58, -18, 148],\n \"8,28\": [180, 0, 0],\n \"8,29\": [-58, -18, 32],\n \"8,30\": [58, 18, 32],\n \"9,10\": [21, -30, -111],\n \"9,11\": [58, 162, 32],\n \"9,12\": [-21, 30, -111],\n \"9,13\": [21, -30, 69],\n \"9,14\": [-58, -54, -32],\n \"9,15\": [58, 18, -148],\n \"9,16\": [58, -162, -32],\n \"9,17\": [0, 0, -180],\n \"9,18\": [-58, -18, -148],\n \"9,19\": [0, -90, 90],\n \"9,20\": [90, 0, 90],\n \"9,21\": [-58, -18, 32],\n \"9,22\": [-58, -54, 148],\n \"9,23\": [58, -126, 32],\n \"9,24\": [-21, -30, 111],\n \"9,25\": [0, -90, -90],\n \"9,26\": [58, -54, -148],\n \"9,27\": [0, 90, -90],\n \"9,28\": [21, -150, 69],\n \"9,29\": [58, -18, 148],\n \"9,30\": [-58, 54, -148],\n \"10,11\": [-21, -150, -69],\n \"10,12\": [-58, -54, -32],\n \"10,13\": [0, 0, 180],\n \"10,14\": [58, -18, 148],\n \"10,15\": [-58, 18, -32],\n \"10,16\": [122, -18, 32],\n \"10,17\": [-21, -30, -69],\n \"10,18\": [58, -54, 32],\n \"10,19\": [58, 18, -148],\n \"10,20\": [-58, 54, -148],\n \"10,21\": [58, -54, -148],\n \"10,22\": [58, -18, -32],\n \"10,23\": [90, 0, 90],\n \"10,24\": [21, -30, -111],\n \"10,25\": [58, 18, 32],\n \"10,26\": [21, 30, -69],\n \"10,27\": [-122, -18, -32],\n \"10,28\": [-58, 162, -32],\n \"10,29\": [-21, 30, -111],\n \"10,30\": [58, -126, 32],\n \"11,12\": [-90, 0, 90],\n \"11,13\": [-159, 30, -69],\n \"11,14\": [0, 90, 90],\n \"11,15\": [-159, -30, 69],\n \"11,16\": [21, 30, -69],\n \"11,17\": [-122, 18, 32],\n \"11,18\": [-58, 54, 32],\n \"11,19\": [122, 54, 32],\n \"11,20\": [159, -30, -69],\n \"11,21\": [-58, 54, -148],\n \"11,22\": [0, 90, -90],\n \"11,23\": [58, 54, -32],\n \"11,24\": [-122, 54, -32],\n \"11,25\": [-58, 126, 32],\n \"11,26\": [159, 30, 69],\n \"11,27\": [-58, -54, 148],\n \"11,28\": [58, 18, 32],\n \"11,29\": [-180, 0, 0],\n \"11,30\": [-58, -18, 32],\n \"12,13\": [58, 54, 148],\n \"12,14\": [90, 0, 90],\n \"12,15\": [-58, 54, 32],\n \"12,16\": [122, -54, -32],\n \"12,17\": [21, 30, -69],\n \"12,18\": [58, -18, -32],\n \"12,19\": [-58, 162, -32],\n \"12,20\": [-122, 54, -32],\n \"12,21\": [58, -18, 148],\n \"12,22\": [90, 0, -90],\n \"12,23\": [122, -18, 32],\n \"12,24\": [58, 18, -148],\n \"12,25\": [122, 18, -32],\n \"12,26\": [-58, 126, 32],\n \"12,27\": [-58, -18, 32],\n \"12,28\": [-21, -150, -69],\n \"12,29\": [0, 90, -90],\n \"12,30\": [-21, -30, -69],\n \"13,14\": [-58, 18, -32],\n \"13,15\": [58, -18, 148],\n \"13,16\": [58, 162, 32],\n \"13,17\": [21, 30, 111],\n \"13,18\": [-58, 54, -148],\n \"13,19\": [-58, -18, 32],\n \"13,20\": [58, -54, 32],\n \"13,21\": [-58, 54, 32],\n \"13,22\": [-58, 18, 148],\n \"13,23\": [-90, 0, -90],\n \"13,24\": [-21, 30, 69],\n \"13,25\": [-58, -18, -148],\n \"13,26\": [-21, -30, 111],\n \"13,27\": [-58, 162, -32],\n \"13,28\": [-122, -18, -32],\n \"13,29\": [21, -30, 69],\n \"13,30\": [122, 54, 32],\n \"14,15\": [-58, 162, -32],\n \"14,16\": [-58, -18, -148],\n \"14,17\": [58, 54, 148],\n \"14,18\": [-21, 30, -111],\n \"14,19\": [21, -30, 69],\n \"14,20\": [122, -18, 32],\n \"14,21\": [-21, 30, 69],\n \"14,22\": [0, 0, 180],\n \"14,23\": [-21, -30, -69],\n \"14,24\": [21, 30, 111],\n \"14,25\": [21, -30, -111],\n \"14,26\": [58, -18, 148],\n \"14,27\": [21, 150, -69],\n \"14,28\": [-58, -54, -32],\n \"14,29\": [90, 0, 90],\n \"14,30\": [-122, 54, -32],\n \"15,16\": [180, 0, 0],\n \"15,17\": [58, -18, -32],\n \"15,18\": [122, -18, 32],\n \"15,19\": [-58, 126, 32],\n \"15,20\": [-21, 30, -111],\n \"15,21\": [-58, -162, 32],\n \"15,22\": [122, 18, -32],\n \"15,23\": [159, 30, 69],\n \"15,24\": [90, 0, -90],\n \"15,25\": [122, 54, 32],\n \"15,26\": [58, 54, -32],\n \"15,27\": [-58, -54, -32],\n \"15,28\": [21, 150, -69],\n \"15,29\": [21, 30, -69],\n \"15,30\": [0, -90, -90],\n \"16,17\": [-122, -18, -32],\n \"16,18\": [-58, -18, 32],\n \"16,19\": [-58, 54, -148],\n \"16,20\": [-21, 150, 69],\n \"16,21\": [-58, -18, -148],\n \"16,22\": [-58, 18, -32],\n \"16,23\": [-21, 30, 69],\n \"16,24\": [-90, 0, -90],\n \"16,25\": [-58, 54, 32],\n \"16,26\": [-122, 54, -32],\n \"16,27\": [122, -54, -32],\n \"16,28\": [21, 30, 111],\n \"16,29\": [-159, 30, -69],\n \"16,30\": [0, -90, 90],\n \"17,18\": [58, 18, 32],\n \"17,19\": [0, 90, -90],\n \"17,20\": [-90, 0, -90],\n \"17,21\": [58, 18, -148],\n \"17,22\": [58, 54, -32],\n \"17,23\": [122, 54, 32],\n \"17,24\": [21, 30, -69],\n \"17,25\": [0, 90, 90],\n \"17,26\": [-58, 54, 32],\n \"17,27\": [0, -90, 90],\n \"17,28\": [159, 30, 69],\n \"17,29\": [-58, 18, -32],\n \"17,30\": [58, -54, 32],\n \"18,19\": [58, 54, 148],\n \"18,20\": [-159, 30, -69],\n \"18,21\": [0, 0, -180],\n \"18,22\": [21, 30, -69],\n \"18,23\": [58, 18, 32],\n \"18,24\": [-21, 30, -111],\n \"18,25\": [58, 54, -32],\n \"18,26\": [0, 90, -90],\n \"18,27\": [-122, -54, 32],\n \"18,28\": [90, 0, 90],\n \"18,29\": [-122, 54, -32],\n \"18,30\": [-58, -54, -32],\n \"19,20\": [0, -90, -90],\n \"19,21\": [58, 54, -32],\n \"19,22\": [21, 30, 111],\n \"19,23\": [-21, 30, -111],\n \"19,24\": [58, 18, 32],\n \"19,25\": [0, 0, 180],\n \"19,26\": [21, -30, 69],\n \"19,27\": [0, 180, 0],\n \"19,28\": [-58, 18, -32],\n \"19,29\": [58, -54, 32],\n \"19,30\": [159, 30, 69],\n \"20,21\": [21, 150, -69],\n \"20,22\": [58, 162, 32],\n \"20,23\": [-122, -18, -32],\n \"20,24\": [58, 126, -32],\n \"20,25\": [-90, 0, -90],\n \"20,26\": [-58, 18, 148],\n \"20,27\": [90, 0, 90],\n \"20,28\": [-122, -54, 32],\n \"20,29\": [-21, 30, 69],\n \"20,30\": [122, 18, -32],\n \"21,22\": [-21, -30, 111],\n \"21,23\": [-58, -18, -148],\n \"21,24\": [21, -30, 69],\n \"21,25\": [-58, -54, 148],\n \"21,26\": [0, -90, 90],\n \"21,27\": [-58, 126, 32],\n \"21,28\": [-90, 0, -90],\n \"21,29\": [-58, -126, -32],\n \"21,30\": [58, 54, 148],\n \"22,23\": [21, 30, 111],\n \"22,24\": [-21, -30, -69],\n \"22,25\": [-21, 30, 69],\n \"22,26\": [-58, 18, -32],\n \"22,27\": [159, -30, -69],\n \"22,28\": [58, 54, 148],\n \"22,29\": [-90, 0, -90],\n \"22,30\": [-58, -126, -32],\n \"23,24\": [-58, 54, -148],\n \"23,25\": [21, 30, -69],\n \"23,26\": [58, 54, 148],\n \"23,27\": [-159, -30, 69],\n \"23,28\": [21, -30, 69],\n \"23,29\": [122, 54, 32],\n \"23,30\": [-122, -18, -32],\n \"24,25\": [-58, 18, 148],\n \"24,26\": [-58, -18, 32],\n \"24,27\": [-58, -162, 32],\n \"24,28\": [-122, 54, -32],\n \"24,29\": [-58, -54, -32],\n \"24,30\": [90, 0, 90],\n \"25,26\": [-21, 30, -111],\n \"25,27\": [-180, 0, 0],\n \"25,28\": [58, -18, 148],\n \"25,29\": [-58, 54, -148],\n \"25,30\": [21, -150, 69],\n \"26,27\": [21, -150, 69],\n \"26,28\": [0, 90, -90],\n \"26,29\": [-21, -30, -69],\n \"26,30\": [-21, -150, -69],\n \"27,28\": [58, -162, -32],\n \"27,29\": [-58, 126, 32],\n \"27,30\": [21, -30, -111],\n \"28,29\": [122, -18, 32],\n \"28,30\": [-122, 18, 32],\n \"29,30\": [122, -18, 32]\n }\n }\n};\n","/**\n * @license\n * Copyright 2010-2023 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\nconst REVISION = '158';\n\nconst MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };\nconst TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };\nconst CullFaceNone = 0;\nconst CullFaceBack = 1;\nconst CullFaceFront = 2;\nconst CullFaceFrontBack = 3;\nconst BasicShadowMap = 0;\nconst PCFShadowMap = 1;\nconst PCFSoftShadowMap = 2;\nconst VSMShadowMap = 3;\nconst FrontSide = 0;\nconst BackSide = 1;\nconst DoubleSide = 2;\nconst TwoPassDoubleSide = 2; // r149\nconst NoBlending = 0;\nconst NormalBlending = 1;\nconst AdditiveBlending = 2;\nconst SubtractiveBlending = 3;\nconst MultiplyBlending = 4;\nconst CustomBlending = 5;\nconst AddEquation = 100;\nconst SubtractEquation = 101;\nconst ReverseSubtractEquation = 102;\nconst MinEquation = 103;\nconst MaxEquation = 104;\nconst ZeroFactor = 200;\nconst OneFactor = 201;\nconst SrcColorFactor = 202;\nconst OneMinusSrcColorFactor = 203;\nconst SrcAlphaFactor = 204;\nconst OneMinusSrcAlphaFactor = 205;\nconst DstAlphaFactor = 206;\nconst OneMinusDstAlphaFactor = 207;\nconst DstColorFactor = 208;\nconst OneMinusDstColorFactor = 209;\nconst SrcAlphaSaturateFactor = 210;\nconst ConstantColorFactor = 211;\nconst OneMinusConstantColorFactor = 212;\nconst ConstantAlphaFactor = 213;\nconst OneMinusConstantAlphaFactor = 214;\nconst NeverDepth = 0;\nconst AlwaysDepth = 1;\nconst LessDepth = 2;\nconst LessEqualDepth = 3;\nconst EqualDepth = 4;\nconst GreaterEqualDepth = 5;\nconst GreaterDepth = 6;\nconst NotEqualDepth = 7;\nconst MultiplyOperation = 0;\nconst MixOperation = 1;\nconst AddOperation = 2;\nconst NoToneMapping = 0;\nconst LinearToneMapping = 1;\nconst ReinhardToneMapping = 2;\nconst CineonToneMapping = 3;\nconst ACESFilmicToneMapping = 4;\nconst CustomToneMapping = 5;\nconst AttachedBindMode = 'attached';\nconst DetachedBindMode = 'detached';\n\nconst UVMapping = 300;\nconst CubeReflectionMapping = 301;\nconst CubeRefractionMapping = 302;\nconst EquirectangularReflectionMapping = 303;\nconst EquirectangularRefractionMapping = 304;\nconst CubeUVReflectionMapping = 306;\nconst RepeatWrapping = 1000;\nconst ClampToEdgeWrapping = 1001;\nconst MirroredRepeatWrapping = 1002;\nconst NearestFilter = 1003;\nconst NearestMipmapNearestFilter = 1004;\nconst NearestMipMapNearestFilter = 1004;\nconst NearestMipmapLinearFilter = 1005;\nconst NearestMipMapLinearFilter = 1005;\nconst LinearFilter = 1006;\nconst LinearMipmapNearestFilter = 1007;\nconst LinearMipMapNearestFilter = 1007;\nconst LinearMipmapLinearFilter = 1008;\nconst LinearMipMapLinearFilter = 1008;\nconst UnsignedByteType = 1009;\nconst ByteType = 1010;\nconst ShortType = 1011;\nconst UnsignedShortType = 1012;\nconst IntType = 1013;\nconst UnsignedIntType = 1014;\nconst FloatType = 1015;\nconst HalfFloatType = 1016;\nconst UnsignedShort4444Type = 1017;\nconst UnsignedShort5551Type = 1018;\nconst UnsignedInt248Type = 1020;\nconst AlphaFormat = 1021;\nconst RGBAFormat = 1023;\nconst LuminanceFormat = 1024;\nconst LuminanceAlphaFormat = 1025;\nconst DepthFormat = 1026;\nconst DepthStencilFormat = 1027;\nconst RedFormat = 1028;\nconst RedIntegerFormat = 1029;\nconst RGFormat = 1030;\nconst RGIntegerFormat = 1031;\nconst RGBAIntegerFormat = 1033;\n\nconst RGB_S3TC_DXT1_Format = 33776;\nconst RGBA_S3TC_DXT1_Format = 33777;\nconst RGBA_S3TC_DXT3_Format = 33778;\nconst RGBA_S3TC_DXT5_Format = 33779;\nconst RGB_PVRTC_4BPPV1_Format = 35840;\nconst RGB_PVRTC_2BPPV1_Format = 35841;\nconst RGBA_PVRTC_4BPPV1_Format = 35842;\nconst RGBA_PVRTC_2BPPV1_Format = 35843;\nconst RGB_ETC1_Format = 36196;\nconst RGB_ETC2_Format = 37492;\nconst RGBA_ETC2_EAC_Format = 37496;\nconst RGBA_ASTC_4x4_Format = 37808;\nconst RGBA_ASTC_5x4_Format = 37809;\nconst RGBA_ASTC_5x5_Format = 37810;\nconst RGBA_ASTC_6x5_Format = 37811;\nconst RGBA_ASTC_6x6_Format = 37812;\nconst RGBA_ASTC_8x5_Format = 37813;\nconst RGBA_ASTC_8x6_Format = 37814;\nconst RGBA_ASTC_8x8_Format = 37815;\nconst RGBA_ASTC_10x5_Format = 37816;\nconst RGBA_ASTC_10x6_Format = 37817;\nconst RGBA_ASTC_10x8_Format = 37818;\nconst RGBA_ASTC_10x10_Format = 37819;\nconst RGBA_ASTC_12x10_Format = 37820;\nconst RGBA_ASTC_12x12_Format = 37821;\nconst RGBA_BPTC_Format = 36492;\nconst RGB_BPTC_SIGNED_Format = 36494;\nconst RGB_BPTC_UNSIGNED_Format = 36495;\nconst RED_RGTC1_Format = 36283;\nconst SIGNED_RED_RGTC1_Format = 36284;\nconst RED_GREEN_RGTC2_Format = 36285;\nconst SIGNED_RED_GREEN_RGTC2_Format = 36286;\nconst LoopOnce = 2200;\nconst LoopRepeat = 2201;\nconst LoopPingPong = 2202;\nconst InterpolateDiscrete = 2300;\nconst InterpolateLinear = 2301;\nconst InterpolateSmooth = 2302;\nconst ZeroCurvatureEnding = 2400;\nconst ZeroSlopeEnding = 2401;\nconst WrapAroundEnding = 2402;\nconst NormalAnimationBlendMode = 2500;\nconst AdditiveAnimationBlendMode = 2501;\nconst TrianglesDrawMode = 0;\nconst TriangleStripDrawMode = 1;\nconst TriangleFanDrawMode = 2;\n/** @deprecated Use LinearSRGBColorSpace or NoColorSpace in three.js r152+. */\nconst LinearEncoding = 3000;\n/** @deprecated Use SRGBColorSpace in three.js r152+. */\nconst sRGBEncoding = 3001;\nconst BasicDepthPacking = 3200;\nconst RGBADepthPacking = 3201;\nconst TangentSpaceNormalMap = 0;\nconst ObjectSpaceNormalMap = 1;\n\n// Color space string identifiers, matching CSS Color Module Level 4 and WebGPU names where available.\nconst NoColorSpace = '';\nconst SRGBColorSpace = 'srgb';\nconst LinearSRGBColorSpace = 'srgb-linear';\nconst DisplayP3ColorSpace = 'display-p3';\nconst LinearDisplayP3ColorSpace = 'display-p3-linear';\n\nconst LinearTransfer = 'linear';\nconst SRGBTransfer = 'srgb';\n\nconst Rec709Primaries = 'rec709';\nconst P3Primaries = 'p3';\n\nconst ZeroStencilOp = 0;\nconst KeepStencilOp = 7680;\nconst ReplaceStencilOp = 7681;\nconst IncrementStencilOp = 7682;\nconst DecrementStencilOp = 7683;\nconst IncrementWrapStencilOp = 34055;\nconst DecrementWrapStencilOp = 34056;\nconst InvertStencilOp = 5386;\n\nconst NeverStencilFunc = 512;\nconst LessStencilFunc = 513;\nconst EqualStencilFunc = 514;\nconst LessEqualStencilFunc = 515;\nconst GreaterStencilFunc = 516;\nconst NotEqualStencilFunc = 517;\nconst GreaterEqualStencilFunc = 518;\nconst AlwaysStencilFunc = 519;\n\nconst NeverCompare = 512;\nconst LessCompare = 513;\nconst EqualCompare = 514;\nconst LessEqualCompare = 515;\nconst GreaterCompare = 516;\nconst NotEqualCompare = 517;\nconst GreaterEqualCompare = 518;\nconst AlwaysCompare = 519;\n\nconst StaticDrawUsage = 35044;\nconst DynamicDrawUsage = 35048;\nconst StreamDrawUsage = 35040;\nconst StaticReadUsage = 35045;\nconst DynamicReadUsage = 35049;\nconst StreamReadUsage = 35041;\nconst StaticCopyUsage = 35046;\nconst DynamicCopyUsage = 35050;\nconst StreamCopyUsage = 35042;\n\nconst GLSL1 = '100';\nconst GLSL3 = '300 es';\n\nconst _SRGBAFormat = 1035; // fallback for WebGL 1\n\nconst WebGLCoordinateSystem = 2000;\nconst WebGPUCoordinateSystem = 2001;\n\n/**\n * https://github.com/mrdoob/eventdispatcher.js/\n */\n\nclass EventDispatcher {\n\n\taddEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tconst 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( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return false;\n\n\t\tconst listeners = this._listeners;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;\n\n\t}\n\n\tremoveEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tconst 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( event ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice( 0 );\n\n\t\t\tfor ( let 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\tevent.target = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _lut = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff' ];\n\nlet _seed = 1234567;\n\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\nfunction generateUUID() {\n\n\tconst d0 = Math.random() * 0xffffffff | 0;\n\tconst d1 = Math.random() * 0xffffffff | 0;\n\tconst d2 = Math.random() * 0xffffffff | 0;\n\tconst d3 = Math.random() * 0xffffffff | 0;\n\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toLowerCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toLowerCase();\n\n}\n\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n// compute euclidean modulo of m % n\n// https://en.wikipedia.org/wiki/Modulo_operation\nfunction euclideanModulo( n, m ) {\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n// Linear mapping from range <a1, a2> to range <b1, b2>\nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\nfunction inverseLerp( x, y, value ) {\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n// https://en.wikipedia.org/wiki/Linear_interpolation\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n// https://www.desmos.com/calculator/vcsjnyz7x4\nfunction pingpong( x, length = 1 ) {\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n// http://en.wikipedia.org/wiki/Smoothstep\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n// Random integer from <low, high> interval\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n// Random float from <low, high> interval\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n// Random float from <-range/2, range/2> interval\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n// Deterministic pseudo-random float in the interval [ 0, 1 ]\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s;\n\n\t// Mulberry32 generator\n\n\tlet t = _seed += 0x6D2B79F5;\n\n\tt = Math.imul( t ^ t >>> 15, t | 1 );\n\n\tt ^= t + Math.imul( t ^ t >>> 7, t | 61 );\n\n\treturn ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296;\n\n}\n\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\t// Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles\n\n\t// rotations are applied to the axes in the order specified by 'order'\n\t// rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c'\n\t// angles are in radians\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\nfunction denormalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn value / 4294967295.0;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn value / 65535.0;\n\n\t\tcase Uint8Array:\n\n\t\t\treturn value / 255.0;\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.max( value / 2147483647.0, - 1.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.max( value / 32767.0, - 1.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.max( value / 127.0, - 1.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nfunction normalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn Math.round( value * 4294967295.0 );\n\n\t\tcase Uint16Array:\n\n\t\t\treturn Math.round( value * 65535.0 );\n\n\t\tcase Uint8Array:\n\n\t\t\treturn Math.round( value * 255.0 );\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.round( value * 2147483647.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.round( value * 32767.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.round( value * 127.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nconst MathUtils = {\n\tDEG2RAD: DEG2RAD,\n\tRAD2DEG: RAD2DEG,\n\tgenerateUUID: generateUUID,\n\tclamp: clamp,\n\teuclideanModulo: euclideanModulo,\n\tmapLinear: mapLinear,\n\tinverseLerp: inverseLerp,\n\tlerp: lerp,\n\tdamp: damp,\n\tpingpong: pingpong,\n\tsmoothstep: smoothstep,\n\tsmootherstep: smootherstep,\n\trandInt: randInt,\n\trandFloat: randFloat,\n\trandFloatSpread: randFloatSpread,\n\tseededRandom: seededRandom,\n\tdegToRad: degToRad,\n\tradToDeg: radToDeg,\n\tisPowerOfTwo: isPowerOfTwo,\n\tceilPowerOfTwo: ceilPowerOfTwo,\n\tfloorPowerOfTwo: floorPowerOfTwo,\n\tsetQuaternionFromProperEuler: setQuaternionFromProperEuler,\n\tnormalize: normalize,\n\tdenormalize: denormalize\n};\n\nclass Vector2 {\n\n\tconstructor( x = 0, y = 0 ) {\n\n\t\tVector2.prototype.isVector2 = true;\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t}\n\n\tget width() {\n\n\t\treturn this.x;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.x = value;\n\n\t}\n\n\tget height() {\n\n\t\treturn this.y;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.y = value;\n\n\t}\n\n\tset( x, y ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( 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( 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() {\n\n\t\treturn new this.constructor( this.x, this.y );\n\n\t}\n\n\tcopy( 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( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( 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( 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( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( 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( 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( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tdivide( 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( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y;\n\t\tconst 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( 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( 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( 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( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst 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() {\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() {\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() {\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() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y;\n\n\t}\n\n\tcross( v ) {\n\n\t\treturn this.x * v.y - this.y * v.x;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tangle() {\n\n\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\tconst angle = Math.atan2( - this.y, - this.x ) + Math.PI;\n\n\t\treturn angle;\n\n\t}\n\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, - 1, 1 ) );\n\n\t}\n\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y;\n\t\treturn dx * dx + dy * dy;\n\n\t}\n\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( 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( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t}\n\n\tfromArray( array, 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( array = [], 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( attribute, index ) {\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( center, angle ) {\n\n\t\tconst c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\tconst x = this.x - center.x;\n\t\tconst 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\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\n\t}\n\n}\n\nclass Matrix3 {\n\n\tconstructor( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tMatrix3.prototype.isMatrix3 = true;\n\n\t\tthis.elements = [\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\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n21, n22, n23, n31, n32, n33 );\n\n\t\t}\n\n\t}\n\n\tset( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tconst 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() {\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\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst 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\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrix3Column( this, 0 );\n\t\tyAxis.setFromMatrix3Column( this, 1 );\n\t\tzAxis.setFromMatrix3Column( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrix4( m ) {\n\n\t\tconst 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\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\tconst 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( s ) {\n\n\t\tconst 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() {\n\n\t\tconst te = this.elements;\n\n\t\tconst 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\tinvert() {\n\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ],\n\t\t\tn12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ],\n\t\t\tn13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 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 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst 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() {\n\n\t\tlet tmp;\n\t\tconst 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( matrix4 ) {\n\n\t\treturn this.setFromMatrix4( matrix4 ).invert().transpose();\n\n\t}\n\n\ttransposeIntoArray( r ) {\n\n\t\tconst 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( tx, ty, sx, sy, rotation, cx, cy ) {\n\n\t\tconst c = Math.cos( rotation );\n\t\tconst 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\treturn this;\n\n\t}\n\n\t//\n\n\tscale( sx, sy ) {\n\n\t\tthis.premultiply( _m3.makeScale( sx, sy ) );\n\n\t\treturn this;\n\n\t}\n\n\trotate( theta ) {\n\n\t\tthis.premultiply( _m3.makeRotation( - theta ) );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( tx, ty ) {\n\n\t\tthis.premultiply( _m3.makeTranslation( tx, ty ) );\n\n\t\treturn this;\n\n\t}\n\n\t// for 2D Transforms\n\n\tmakeTranslation( x, y ) {\n\n\t\tif ( x.isVector2 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x.x,\n\t\t\t\t0, 1, x.y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x,\n\t\t\t\t0, 1, y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotation( theta ) {\n\n\t\t// counterclockwise\n\n\t\tconst c = Math.cos( theta );\n\t\tconst s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0,\n\t\t\ts, c, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeScale( x, y ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0,\n\t\t\t0, y, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t//\n\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let 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( array, offset = 0 ) {\n\n\t\tfor ( let 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( array = [], offset = 0 ) {\n\n\t\tconst 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\tclone() {\n\n\t\treturn new this.constructor().fromArray( this.elements );\n\n\t}\n\n}\n\nconst _m3 = /*@__PURE__*/ new Matrix3();\n\nfunction arrayNeedsUint32( array ) {\n\n\t// assumes larger values usually on last\n\n\tfor ( let i = array.length - 1; i >= 0; -- i ) {\n\n\t\tif ( array[ i ] >= 65535 ) return true; // account for PRIMITIVE_RESTART_FIXED_INDEX, #24565\n\n\t}\n\n\treturn false;\n\n}\n\nconst TYPED_ARRAYS = {\n\tInt8Array: Int8Array,\n\tUint8Array: Uint8Array,\n\tUint8ClampedArray: Uint8ClampedArray,\n\tInt16Array: Int16Array,\n\tUint16Array: Uint16Array,\n\tInt32Array: Int32Array,\n\tUint32Array: Uint32Array,\n\tFloat32Array: Float32Array,\n\tFloat64Array: Float64Array\n};\n\nfunction getTypedArray( type, buffer ) {\n\n\treturn new TYPED_ARRAYS[ type ]( buffer );\n\n}\n\nfunction createElementNS( name ) {\n\n\treturn document.createElementNS( 'http://www.w3.org/1999/xhtml', name );\n\n}\n\nfunction createCanvasElement() {\n\n\tconst canvas = createElementNS( 'canvas' );\n\tcanvas.style.display = 'block';\n\treturn canvas;\n\n}\n\nconst _cache = {};\n\nfunction warnOnce( message ) {\n\n\tif ( message in _cache ) return;\n\n\t_cache[ message ] = true;\n\n\tconsole.warn( message );\n\n}\n\n/**\n * Matrices converting P3 <-> Rec. 709 primaries, without gamut mapping\n * or clipping. Based on W3C specifications for sRGB and Display P3,\n * and ICC specifications for the D50 connection space. Values in/out\n * are _linear_ sRGB and _linear_ Display P3.\n *\n * Note that both sRGB and Display P3 use the sRGB transfer functions.\n *\n * Reference:\n * - http://www.russellcottrell.com/photo/matrixCalculator.htm\n */\n\nconst LINEAR_SRGB_TO_LINEAR_DISPLAY_P3 = /*@__PURE__*/ new Matrix3().set(\n\t0.8224621, 0.177538, 0.0,\n\t0.0331941, 0.9668058, 0.0,\n\t0.0170827, 0.0723974, 0.9105199,\n);\n\nconst LINEAR_DISPLAY_P3_TO_LINEAR_SRGB = /*@__PURE__*/ new Matrix3().set(\n\t1.2249401, - 0.2249404, 0.0,\n\t- 0.0420569, 1.0420571, 0.0,\n\t- 0.0196376, - 0.0786361, 1.0982735\n);\n\n/**\n * Defines supported color spaces by transfer function and primaries,\n * and provides conversions to/from the Linear-sRGB reference space.\n */\nconst COLOR_SPACES = {\n\t[ LinearSRGBColorSpace ]: {\n\t\ttransfer: LinearTransfer,\n\t\tprimaries: Rec709Primaries,\n\t\ttoReference: ( color ) => color,\n\t\tfromReference: ( color ) => color,\n\t},\n\t[ SRGBColorSpace ]: {\n\t\ttransfer: SRGBTransfer,\n\t\tprimaries: Rec709Primaries,\n\t\ttoReference: ( color ) => color.convertSRGBToLinear(),\n\t\tfromReference: ( color ) => color.convertLinearToSRGB(),\n\t},\n\t[ LinearDisplayP3ColorSpace ]: {\n\t\ttransfer: LinearTransfer,\n\t\tprimaries: P3Primaries,\n\t\ttoReference: ( color ) => color.applyMatrix3( LINEAR_DISPLAY_P3_TO_LINEAR_SRGB ),\n\t\tfromReference: ( color ) => color.applyMatrix3( LINEAR_SRGB_TO_LINEAR_DISPLAY_P3 ),\n\t},\n\t[ DisplayP3ColorSpace ]: {\n\t\ttransfer: SRGBTransfer,\n\t\tprimaries: P3Primaries,\n\t\ttoReference: ( color ) => color.convertSRGBToLinear().applyMatrix3( LINEAR_DISPLAY_P3_TO_LINEAR_SRGB ),\n\t\tfromReference: ( color ) => color.applyMatrix3( LINEAR_SRGB_TO_LINEAR_DISPLAY_P3 ).convertLinearToSRGB(),\n\t},\n};\n\nconst SUPPORTED_WORKING_COLOR_SPACES = new Set( [ LinearSRGBColorSpace, LinearDisplayP3ColorSpace ] );\n\nconst ColorManagement = {\n\n\tenabled: true,\n\n\t_workingColorSpace: LinearSRGBColorSpace,\n\n\tget legacyMode() {\n\n\t\tconsole.warn( 'THREE.ColorManagement: .legacyMode=false renamed to .enabled=true in r150.' );\n\n\t\treturn ! this.enabled;\n\n\t},\n\n\tset legacyMode( legacyMode ) {\n\n\t\tconsole.warn( 'THREE.ColorManagement: .legacyMode=false renamed to .enabled=true in r150.' );\n\n\t\tthis.enabled = ! legacyMode;\n\n\t},\n\n\tget workingColorSpace() {\n\n\t\treturn this._workingColorSpace;\n\n\t},\n\n\tset workingColorSpace( colorSpace ) {\n\n\t\tif ( ! SUPPORTED_WORKING_COLOR_SPACES.has( colorSpace ) ) {\n\n\t\t\tthrow new Error( `Unsupported working color space, \"${ colorSpace }\".` );\n\n\t\t}\n\n\t\tthis._workingColorSpace = colorSpace;\n\n\t},\n\n\tconvert: function ( color, sourceColorSpace, targetColorSpace ) {\n\n\t\tif ( this.enabled === false || sourceColorSpace === targetColorSpace || ! sourceColorSpace || ! targetColorSpace ) {\n\n\t\t\treturn color;\n\n\t\t}\n\n\t\tconst sourceToReference = COLOR_SPACES[ sourceColorSpace ].toReference;\n\t\tconst targetFromReference = COLOR_SPACES[ targetColorSpace ].fromReference;\n\n\t\treturn targetFromReference( sourceToReference( color ) );\n\n\t},\n\n\tfromWorkingColorSpace: function ( color, targetColorSpace ) {\n\n\t\treturn this.convert( color, this._workingColorSpace, targetColorSpace );\n\n\t},\n\n\ttoWorkingColorSpace: function ( color, sourceColorSpace ) {\n\n\t\treturn this.convert( color, sourceColorSpace, this._workingColorSpace );\n\n\t},\n\n\tgetPrimaries: function ( colorSpace ) {\n\n\t\treturn COLOR_SPACES[ colorSpace ].primaries;\n\n\t},\n\n\tgetTransfer: function ( colorSpace ) {\n\n\t\tif ( colorSpace === NoColorSpace ) return LinearTransfer;\n\n\t\treturn COLOR_SPACES[ colorSpace ].transfer;\n\n\t},\n\n};\n\n\nfunction SRGBToLinear( c ) {\n\n\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n}\n\nfunction LinearToSRGB( c ) {\n\n\treturn ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055;\n\n}\n\nlet _canvas;\n\nclass ImageUtils {\n\n\tstatic getDataURL( image ) {\n\n\t\tif ( /^data:/i.test( image.src ) ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tif ( typeof HTMLCanvasElement === 'undefined' ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tlet canvas;\n\n\t\tif ( image instanceof HTMLCanvasElement ) {\n\n\t\t\tcanvas = image;\n\n\t\t} else {\n\n\t\t\tif ( _canvas === undefined ) _canvas = createElementNS( 'canvas' );\n\n\t\t\t_canvas.width = image.width;\n\t\t\t_canvas.height = image.height;\n\n\t\t\tconst context = _canvas.getContext( '2d' );\n\n\t\t\tif ( image instanceof ImageData ) {\n\n\t\t\t\tcontext.putImageData( image, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t}\n\n\t\t\tcanvas = _canvas;\n\n\t\t}\n\n\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons', image );\n\n\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t} else {\n\n\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t}\n\n\t}\n\n\tstatic sRGBToLinear( image ) {\n\n\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\tconst canvas = createElementNS( 'canvas' );\n\n\t\t\tcanvas.width = image.width;\n\t\t\tcanvas.height = image.height;\n\n\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\tconst imageData = context.getImageData( 0, 0, image.width, image.height );\n\t\t\tconst data = imageData.data;\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] / 255 ) * 255;\n\n\t\t\t}\n\n\t\t\tcontext.putImageData( imageData, 0, 0 );\n\n\t\t\treturn canvas;\n\n\t\t} else if ( image.data ) {\n\n\t\t\tconst data = image.data.slice( 0 );\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tif ( data instanceof Uint8Array || data instanceof Uint8ClampedArray ) {\n\n\t\t\t\t\tdata[ i ] = Math.floor( SRGBToLinear( data[ i ] / 255 ) * 255 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assuming float\n\n\t\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdata: data,\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.' );\n\t\t\treturn image;\n\n\t\t}\n\n\t}\n\n}\n\nlet _sourceId = 0;\n\nclass Source {\n\n\tconstructor( data = null ) {\n\n\t\tthis.isSource = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _sourceId ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.data = data;\n\n\t\tthis.version = 0;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.images[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.images[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\t\t\tuuid: this.uuid,\n\t\t\turl: ''\n\t\t};\n\n\t\tconst data = this.data;\n\n\t\tif ( data !== null ) {\n\n\t\t\tlet url;\n\n\t\t\tif ( Array.isArray( data ) ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\turl = [];\n\n\t\t\t\tfor ( let i = 0, l = data.length; i < l; i ++ ) {\n\n\t\t\t\t\tif ( data[ i ].isDataTexture ) {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ].image ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ 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\t// texture\n\n\t\t\t\turl = serializeImage( data );\n\n\t\t\t}\n\n\t\t\toutput.url = url;\n\n\t\t}\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.images[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n}\n\nfunction serializeImage( image ) {\n\n\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t// default images\n\n\t\treturn ImageUtils.getDataURL( image );\n\n\t} else {\n\n\t\tif ( image.data ) {\n\n\t\t\t// images of DataTexture\n\n\t\t\treturn {\n\t\t\t\tdata: Array.from( image.data ),\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height,\n\t\t\t\ttype: image.data.constructor.name\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.Texture: Unable to serialize Texture.' );\n\t\t\treturn {};\n\n\t\t}\n\n\t}\n\n}\n\nlet _textureId = 0;\n\nclass Texture extends EventDispatcher {\n\n\tconstructor( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = Texture.DEFAULT_ANISOTROPY, colorSpace = NoColorSpace ) {\n\n\t\tsuper();\n\n\t\tthis.isTexture = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _textureId ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\n\t\tthis.source = new Source( image );\n\t\tthis.mipmaps = [];\n\n\t\tthis.mapping = mapping;\n\t\tthis.channel = 0;\n\n\t\tthis.wrapS = wrapS;\n\t\tthis.wrapT = wrapT;\n\n\t\tthis.magFilter = magFilter;\n\t\tthis.minFilter = minFilter;\n\n\t\tthis.anisotropy = anisotropy;\n\n\t\tthis.format = format;\n\t\tthis.internalFormat = null;\n\t\tthis.type = type;\n\n\t\tthis.offset = new Vector2( 0, 0 );\n\t\tthis.repeat = new Vector2( 1, 1 );\n\t\tthis.center = new Vector2( 0, 0 );\n\t\tthis.rotation = 0;\n\n\t\tthis.matrixAutoUpdate = true;\n\t\tthis.matrix = new Matrix3();\n\n\t\tthis.generateMipmaps = true;\n\t\tthis.premultiplyAlpha = false;\n\t\tthis.flipY = true;\n\t\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\tif ( typeof colorSpace === 'string' ) {\n\n\t\t\tthis.colorSpace = colorSpace;\n\n\t\t} else { // @deprecated, r152\n\n\t\t\twarnOnce( 'THREE.Texture: Property .encoding has been replaced by .colorSpace.' );\n\t\t\tthis.colorSpace = colorSpace === sRGBEncoding ? SRGBColorSpace : NoColorSpace;\n\n\t\t}\n\n\n\t\tthis.userData = {};\n\n\t\tthis.version = 0;\n\t\tthis.onUpdate = null;\n\n\t\tthis.isRenderTargetTexture = false; // indicates whether a texture belongs to a render target or not\n\t\tthis.needsPMREMUpdate = false; // indicates whether this texture should be processed by PMREMGenerator or not (only relevant for render target textures)\n\n\t}\n\n\tget image() {\n\n\t\treturn this.source.data;\n\n\t}\n\n\tset image( value = null ) {\n\n\t\tthis.source.data = value;\n\n\t}\n\n\tupdateMatrix() {\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() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.source = source.source;\n\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\tthis.mapping = source.mapping;\n\t\tthis.channel = source.channel;\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.internalFormat = source.internalFormat;\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.colorSpace = source.colorSpace;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tthis.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst 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\tconst output = {\n\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.6,\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\timage: this.source.toJSON( meta ).uuid,\n\n\t\t\tmapping: this.mapping,\n\t\t\tchannel: this.channel,\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\tinternalFormat: this.internalFormat,\n\t\t\ttype: this.type,\n\t\t\tcolorSpace: this.colorSpace,\n\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\tgenerateMipmaps: this.generateMipmaps,\n\t\t\tpremultiplyAlpha: this.premultiplyAlpha,\n\t\t\tunpackAlignment: this.unpackAlignment\n\n\t\t};\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) output.userData = this.userData;\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() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\ttransformUv( uv ) {\n\n\t\tif ( this.mapping !== UVMapping ) return uv;\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\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\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\treturn uv;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.version ++;\n\t\t\tthis.source.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tget encoding() { // @deprecated, r152\n\n\t\twarnOnce( 'THREE.Texture: Property .encoding has been replaced by .colorSpace.' );\n\t\treturn this.colorSpace === SRGBColorSpace ? sRGBEncoding : LinearEncoding;\n\n\t}\n\n\tset encoding( encoding ) { // @deprecated, r152\n\n\t\twarnOnce( 'THREE.Texture: Property .encoding has been replaced by .colorSpace.' );\n\t\tthis.colorSpace = encoding === sRGBEncoding ? SRGBColorSpace : NoColorSpace;\n\n\t}\n\n}\n\nTexture.DEFAULT_IMAGE = null;\nTexture.DEFAULT_MAPPING = UVMapping;\nTexture.DEFAULT_ANISOTROPY = 1;\n\nclass Vector4 {\n\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\tVector4.prototype.isVector4 = true;\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t}\n\n\tget width() {\n\n\t\treturn this.z;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.z = value;\n\n\t}\n\n\tget height() {\n\n\t\treturn this.w;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.w = value;\n\n\t}\n\n\tset( 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( 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( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetW( w ) {\n\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( 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( 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() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t}\n\n\tcopy( 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( 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;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( 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( 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( 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( 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;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( 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( 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\tmultiply( 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;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( 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( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tconst 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( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tsetAxisAngleFromQuaternion( 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\tconst 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( 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\tlet angle, x, y, z; // variables for result\n\t\tconst epsilon = 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\tconst xx = ( m11 + 1 ) / 2;\n\t\t\tconst yy = ( m22 + 1 ) / 2;\n\t\t\tconst zz = ( m33 + 1 ) / 2;\n\t\t\tconst xy = ( m12 + m21 ) / 4;\n\t\t\tconst xz = ( m13 + m31 ) / 4;\n\t\t\tconst 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\tlet s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t( m13 - m31 ) * ( m13 - m31 ) +\n\t\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( 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( 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( 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( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\t\tthis.w = Math.max( minVal, Math.min( maxVal, this.w ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst 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() {\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() {\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() {\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() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\t\tthis.w = Math.trunc( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\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( 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() {\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() {\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() {\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() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( 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( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\t\tthis.w = v1.w + ( v2.w - v1.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tequals( 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( array, 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( array = [], 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( attribute, index ) {\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\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\t\tthis.w = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\t\tyield this.w;\n\n\t}\n\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*/\nclass RenderTarget extends EventDispatcher {\n\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.isRenderTarget = true;\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.depth = 1;\n\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\t\tthis.scissorTest = false;\n\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\tconst image = { width: width, height: height, depth: 1 };\n\n\t\tif ( options.encoding !== undefined ) {\n\n\t\t\t// @deprecated, r152\n\t\t\twarnOnce( 'THREE.WebGLRenderTarget: option.encoding has been replaced by option.colorSpace.' );\n\t\t\toptions.colorSpace = options.encoding === sRGBEncoding ? SRGBColorSpace : NoColorSpace;\n\n\t\t}\n\n\t\toptions = Object.assign( {\n\t\t\tgenerateMipmaps: false,\n\t\t\tinternalFormat: null,\n\t\t\tminFilter: LinearFilter,\n\t\t\tdepthBuffer: true,\n\t\t\tstencilBuffer: false,\n\t\t\tdepthTexture: null,\n\t\t\tsamples: 0\n\t\t}, options );\n\n\t\tthis.texture = new Texture( image, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.colorSpace );\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t\tthis.texture.flipY = false;\n\t\tthis.texture.generateMipmaps = options.generateMipmaps;\n\t\tthis.texture.internalFormat = options.internalFormat;\n\n\t\tthis.depthBuffer = options.depthBuffer;\n\t\tthis.stencilBuffer = options.stencilBuffer;\n\n\t\tthis.depthTexture = options.depthTexture;\n\n\t\tthis.samples = options.samples;\n\n\t}\n\n\tsetSize( width, height, depth = 1 ) {\n\n\t\tif ( this.width !== width || this.height !== height || this.depth !== depth ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.depth = depth;\n\n\t\t\tthis.texture.image.width = width;\n\t\t\tthis.texture.image.height = height;\n\t\t\tthis.texture.image.depth = depth;\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() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\t\tthis.depth = source.depth;\n\n\t\tthis.scissor.copy( source.scissor );\n\t\tthis.scissorTest = source.scissorTest;\n\n\t\tthis.viewport.copy( source.viewport );\n\n\t\tthis.texture = source.texture.clone();\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t\t// ensure image object is not shared, see #20328\n\n\t\tconst image = Object.assign( {}, source.texture.image );\n\t\tthis.texture.source = new Source( image );\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\n\t\tif ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();\n\n\t\tthis.samples = source.samples;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nclass WebGLRenderTarget extends RenderTarget {\n\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\tthis.isWebGLRenderTarget = true;\n\n\t}\n\n}\n\nclass DataArrayTexture extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\tsuper( null );\n\n\t\tthis.isDataArrayTexture = true;\n\n\t\tthis.image = { data, width, height, depth };\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nclass WebGLArrayRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( width = 1, height = 1, depth = 1 ) {\n\n\t\tsuper( width, height );\n\n\t\tthis.isWebGLArrayRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\tthis.texture = new DataArrayTexture( null, width, height, depth );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\nclass Data3DTexture extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\t// We're going to add .setXXX() methods for setting properties later.\n\t\t// Users can still set in DataTexture3D directly.\n\t\t//\n\t\t//\tconst texture = new THREE.DataTexture3D( data, width, height, depth );\n\t\t// \ttexture.anisotropy = 16;\n\t\t//\n\t\t// See #14839\n\n\t\tsuper( null );\n\n\t\tthis.isData3DTexture = true;\n\n\t\tthis.image = { data, width, height, depth };\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nclass WebGL3DRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( width = 1, height = 1, depth = 1 ) {\n\n\t\tsuper( width, height );\n\n\t\tthis.isWebGL3DRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\tthis.texture = new Data3DTexture( null, width, height, depth );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\nclass WebGLMultipleRenderTargets extends WebGLRenderTarget {\n\n\tconstructor( width = 1, height = 1, count = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\tthis.isWebGLMultipleRenderTargets = true;\n\n\t\tconst texture = this.texture;\n\n\t\tthis.texture = [];\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.texture[ i ] = texture.clone();\n\t\t\tthis.texture[ i ].isRenderTargetTexture = true;\n\n\t\t}\n\n\t}\n\n\tsetSize( width, height, depth = 1 ) {\n\n\t\tif ( this.width !== width || this.height !== height || this.depth !== depth ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.depth = depth;\n\n\t\t\tfor ( let i = 0, il = this.texture.length; i < il; i ++ ) {\n\n\t\t\t\tthis.texture[ i ].image.width = width;\n\t\t\t\tthis.texture[ i ].image.height = height;\n\t\t\t\tthis.texture[ i ].image.depth = depth;\n\n\t\t\t}\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\tcopy( source ) {\n\n\t\tthis.dispose();\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\t\tthis.depth = source.depth;\n\n\t\tthis.scissor.copy( source.scissor );\n\t\tthis.scissorTest = source.scissorTest;\n\n\t\tthis.viewport.copy( source.viewport );\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\n\t\tif ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();\n\n\t\tthis.texture.length = 0;\n\n\t\tfor ( let i = 0, il = source.texture.length; i < il; i ++ ) {\n\n\t\t\tthis.texture[ i ] = source.texture[ i ].clone();\n\t\t\tthis.texture[ i ].isRenderTargetTexture = true;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass Quaternion {\n\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\tthis.isQuaternion = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t}\n\n\tstatic slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\tlet 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\tconst x1 = 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 ( t === 0 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( t === 1 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x1;\n\t\t\tdst[ dstOffset + 1 ] = y1;\n\t\t\tdst[ dstOffset + 2 ] = z1;\n\t\t\tdst[ dstOffset + 3 ] = w1;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tlet s = 1 - t;\n\t\t\tconst cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\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\tconst 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\tconst 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\tconst 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\tstatic multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {\n\n\t\tconst x0 = src0[ srcOffset0 ];\n\t\tconst y0 = src0[ srcOffset0 + 1 ];\n\t\tconst z0 = src0[ srcOffset0 + 2 ];\n\t\tconst w0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 ];\n\t\tconst y1 = src1[ srcOffset1 + 1 ];\n\t\tconst z1 = src1[ srcOffset1 + 2 ];\n\t\tconst w1 = src1[ srcOffset1 + 3 ];\n\n\t\tdst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\tdst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\tdst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\tdst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n\t\treturn dst;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget w() {\n\n\t\treturn this._w;\n\n\t}\n\n\tset w( value ) {\n\n\t\tthis._w = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( 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() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t}\n\n\tcopy( 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( euler, update ) {\n\n\t\tconst 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\tconst cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c1 = cos( x / 2 );\n\t\tconst c2 = cos( y / 2 );\n\t\tconst c3 = cos( z / 2 );\n\n\t\tconst s1 = sin( x / 2 );\n\t\tconst s2 = sin( y / 2 );\n\t\tconst s3 = sin( z / 2 );\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .setFromEuler() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tif ( update !== false ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromAxisAngle( 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\tconst 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( 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\tconst 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\n\t\tif ( trace > 0 ) {\n\n\t\t\tconst s = 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\tconst s = 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\tconst s = 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\tconst s = 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( vFrom, vTo ) {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tlet r = vFrom.dot( vTo ) + 1;\n\n\t\tif ( r < Number.EPSILON ) {\n\n\t\t\t// vFrom and vTo point in opposite directions\n\n\t\t\tr = 0;\n\n\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\tthis._x = - vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = - vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\n\t\t}\n\n\t\treturn this.normalize();\n\n\t}\n\n\tangleTo( q ) {\n\n\t\treturn 2 * Math.acos( Math.abs( clamp( this.dot( q ), - 1, 1 ) ) );\n\n\t}\n\n\trotateTowards( q, step ) {\n\n\t\tconst angle = this.angleTo( q );\n\n\t\tif ( angle === 0 ) return this;\n\n\t\tconst t = Math.min( 1, step / angle );\n\n\t\tthis.slerp( q, t );\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\treturn this.set( 0, 0, 0, 1 );\n\n\t}\n\n\tinvert() {\n\n\t\t// quaternion is assumed to have unit length\n\n\t\treturn this.conjugate();\n\n\t}\n\n\tconjugate() {\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( 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() {\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() {\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() {\n\n\t\tlet 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( q ) {\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t}\n\n\tpremultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t}\n\n\tmultiplyQuaternions( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tconst qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tconst 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( qb, t ) {\n\n\t\tif ( t === 0 ) return this;\n\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\tconst 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\tlet 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\tconst sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;\n\n\t\tif ( sqrSinHalfTheta <= Number.EPSILON ) {\n\n\t\t\tconst s = 1 - t;\n\t\t\tthis._w = s * w + t * this._w;\n\t\t\tthis._x = s * x + t * this._x;\n\t\t\tthis._y = s * y + t * this._y;\n\t\t\tthis._z = s * z + t * this._z;\n\n\t\t\tthis.normalize();\n\t\t\tthis._onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sinHalfTheta = Math.sqrt( sqrSinHalfTheta );\n\t\tconst halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\tconst 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\tslerpQuaternions( qa, qb, t ) {\n\n\t\treturn this.copy( qa ).slerp( qb, t );\n\n\t}\n\n\trandom() {\n\n\t\t// Derived from http://planning.cs.uiuc.edu/node198.html\n\t\t// Note, this source uses w, x, y, z ordering,\n\t\t// so we swap the order below.\n\n\t\tconst u1 = Math.random();\n\t\tconst sqrt1u1 = Math.sqrt( 1 - u1 );\n\t\tconst sqrtu1 = Math.sqrt( u1 );\n\n\t\tconst u2 = 2 * Math.PI * Math.random();\n\n\t\tconst u3 = 2 * Math.PI * Math.random();\n\n\t\treturn this.set(\n\t\t\tsqrt1u1 * Math.cos( u2 ),\n\t\t\tsqrtu1 * Math.sin( u3 ),\n\t\t\tsqrtu1 * Math.cos( u3 ),\n\t\t\tsqrt1u1 * Math.sin( u2 ),\n\t\t);\n\n\t}\n\n\tequals( 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( array, 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( array = [], 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( attribute, index ) {\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\ttoJSON() {\n\n\t\treturn this.toArray();\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._w;\n\n\t}\n\n}\n\nclass Vector3 {\n\n\tconstructor( x = 0, y = 0, z = 0 ) {\n\n\t\tVector3.prototype.isVector3 = true;\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t}\n\n\tset( x, y, z ) {\n\n\t\tif ( z === undefined ) z = this.z; // sprite.scale.set(x,y)\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( 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( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( 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( 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() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t}\n\n\tcopy( 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( 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\taddScalar( 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( 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( 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( 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\tsubScalar( 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( 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( 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\tmultiplyScalar( 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( 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( euler ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromEuler( euler ) );\n\n\t}\n\n\tapplyAxisAngle( axis, angle ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromAxisAngle( axis, angle ) );\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst 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\tapplyNormalMatrix( m ) {\n\n\t\treturn this.applyMatrix3( m ).normalize();\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tconst 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( q ) {\n\n\t\t// quaternion q is assumed to have unit length\n\n\t\tconst vx = this.x, vy = this.y, vz = this.z;\n\t\tconst qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// t = 2 * cross( q.xyz, v );\n\t\tconst tx = 2 * ( qy * vz - qz * vy );\n\t\tconst ty = 2 * ( qz * vx - qx * vz );\n\t\tconst tz = 2 * ( qx * vy - qy * vx );\n\n\t\t// v + q.w * t + cross( q.xyz, t );\n\t\tthis.x = vx + qw * tx + qy * tz - qz * ty;\n\t\tthis.y = vy + qw * ty + qz * tx - qx * tz;\n\t\tthis.z = vz + qw * tz + qx * ty - qy * tx;\n\n\t\treturn this;\n\n\t}\n\n\tproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );\n\n\t}\n\n\tunproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst 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( 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( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tmin( 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( 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( 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( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst 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() {\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() {\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() {\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() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\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( 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() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( 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( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tcross( v ) {\n\n\t\treturn this.crossVectors( this, v );\n\n\t}\n\n\tcrossVectors( a, b ) {\n\n\t\tconst ax = a.x, ay = a.y, az = a.z;\n\t\tconst 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( v ) {\n\n\t\tconst denominator = v.lengthSq();\n\n\t\tif ( denominator === 0 ) return this.set( 0, 0, 0 );\n\n\t\tconst scalar = v.dot( this ) / denominator;\n\n\t\treturn this.copy( v ).multiplyScalar( scalar );\n\n\t}\n\n\tprojectOnPlane( planeNormal ) {\n\n\t\t_vector$b.copy( this ).projectOnVector( planeNormal );\n\n\t\treturn this.sub( _vector$b );\n\n\t}\n\n\treflect( normal ) {\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\treturn this.sub( _vector$b.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t}\n\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, - 1, 1 ) );\n\n\t}\n\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\tdistanceToSquared( v ) {\n\n\t\tconst 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( 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( s ) {\n\n\t\treturn this.setFromSphericalCoords( s.radius, s.phi, s.theta );\n\n\t}\n\n\tsetFromSphericalCoords( radius, phi, theta ) {\n\n\t\tconst sinPhiRadius = Math.sin( phi ) * radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( theta );\n\t\tthis.y = Math.cos( phi ) * radius;\n\t\tthis.z = sinPhiRadius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCylindrical( c ) {\n\n\t\treturn this.setFromCylindricalCoords( c.radius, c.theta, c.y );\n\n\t}\n\n\tsetFromCylindricalCoords( radius, theta, y ) {\n\n\t\tthis.x = radius * Math.sin( theta );\n\t\tthis.y = y;\n\t\tthis.z = radius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst 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( m ) {\n\n\t\tconst sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tconst sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tconst 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( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t}\n\n\tsetFromMatrix3Column( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 3 );\n\n\t}\n\n\tsetFromEuler( e ) {\n\n\t\tthis.x = e._x;\n\t\tthis.y = e._y;\n\t\tthis.z = e._z;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromColor( c ) {\n\n\t\tthis.x = c.r;\n\t\tthis.y = c.g;\n\t\tthis.z = c.b;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t}\n\n\tfromArray( array, 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( array = [], 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( attribute, index ) {\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\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\trandomDirection() {\n\n\t\t// Derived from https://mathworld.wolfram.com/SpherePointPicking.html\n\n\t\tconst u = ( Math.random() - 0.5 ) * 2;\n\t\tconst t = Math.random() * Math.PI * 2;\n\t\tconst f = Math.sqrt( 1 - u ** 2 );\n\n\t\tthis.x = f * Math.cos( t );\n\t\tthis.y = f * Math.sin( t );\n\t\tthis.z = u;\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\n\t}\n\n}\n\nconst _vector$b = /*@__PURE__*/ new Vector3();\nconst _quaternion$4 = /*@__PURE__*/ new Quaternion();\n\nclass Box3 {\n\n\tconstructor( min = new Vector3( + Infinity, + Infinity, + Infinity ), max = new Vector3( - Infinity, - Infinity, - Infinity ) ) {\n\n\t\tthis.isBox3 = true;\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t}\n\n\tset( 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( array ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = array.length; i < il; i += 3 ) {\n\n\t\t\tthis.expandByPoint( _vector$a.fromArray( array, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromBufferAttribute( attribute ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( _vector$a.fromBufferAttribute( attribute, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let 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( center, size ) {\n\n\t\tconst halfSize = _vector$a.copy( size ).multiplyScalar( 0.5 );\n\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromObject( object, precise = false ) {\n\n\t\tthis.makeEmpty();\n\n\t\treturn this.expandByObject( object, precise );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( 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() {\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() {\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( target ) {\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( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\texpandByPoint( 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( 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( 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( object, precise = false ) {\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\tobject.updateWorldMatrix( false, false );\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\t\t// precise AABB computation based on vertex data requires at least a position attribute.\n\t\t\t// instancing isn't supported so far and uses the normal (conservative) code path.\n\n\t\t\tif ( precise === true && positionAttribute !== undefined && object.isInstancedMesh !== true ) {\n\n\t\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tif ( object.isMesh === true ) {\n\n\t\t\t\t\t\tobject.getVertexPosition( i, _vector$a );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_vector$a.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_vector$a.applyMatrix4( object.matrixWorld );\n\t\t\t\t\tthis.expandByPoint( _vector$a );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( object.boundingBox !== undefined ) {\n\n\t\t\t\t\t// object-level bounding box\n\n\t\t\t\t\tif ( object.boundingBox === null ) {\n\n\t\t\t\t\t\tobject.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box$3.copy( object.boundingBox );\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// geometry-level bounding box\n\n\t\t\t\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\t\t\t\tgeometry.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box$3.copy( geometry.boundingBox );\n\n\t\t\t\t}\n\n\t\t\t\t_box$3.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tthis.union( _box$3 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tthis.expandByObject( children[ i ], precise );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( 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( 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( 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\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( 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( sphere ) {\n\n\t\t// Find the point on the AABB closest to the sphere center.\n\t\tthis.clampPoint( sphere.center, _vector$a );\n\n\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\treturn _vector$a.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\tintersectsPlane( 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\tlet 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( triangle ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// compute box center and extents\n\t\tthis.getCenter( _center );\n\t\t_extents.subVectors( this.max, _center );\n\n\t\t// translate triangle to aabb origin\n\t\t_v0$2.subVectors( triangle.a, _center );\n\t\t_v1$7.subVectors( triangle.b, _center );\n\t\t_v2$4.subVectors( triangle.c, _center );\n\n\t\t// compute edge vectors for triangle\n\t\t_f0.subVectors( _v1$7, _v0$2 );\n\t\t_f1.subVectors( _v2$4, _v1$7 );\n\t\t_f2.subVectors( _v0$2, _v2$4 );\n\n\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// 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// 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\tlet axes = [\n\t\t\t0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y,\n\t\t\t_f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x,\n\t\t\t- _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0\n\t\t];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// test 3 face normals from the aabb\n\t\taxes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// finally testing the face normal of the triangle\n\t\t// use already existing triangle edge vectors here\n\t\t_triangleNormal.crossVectors( _f0, _f1 );\n\t\taxes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ];\n\n\t\treturn satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents );\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _vector$a ).distanceTo( point );\n\n\t}\n\n\tgetBoundingSphere( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\ttarget.makeEmpty();\n\n\t\t} else {\n\n\t\t\tthis.getCenter( target.center );\n\n\t\t\ttarget.radius = this.getSize( _vector$a ).length() * 0.5;\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tintersect( 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( 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( matrix ) {\n\n\t\t// transform of empty box is an empty box.\n\t\tif ( this.isEmpty() ) return this;\n\n\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t_points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t_points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t_points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t_points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t_points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t_points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t_points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t_points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111\n\n\t\tthis.setFromPoints( _points );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( 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( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nconst _points = [\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3()\n];\n\nconst _vector$a = /*@__PURE__*/ new Vector3();\n\nconst _box$3 = /*@__PURE__*/ new Box3();\n\n// triangle centered vertices\n\nconst _v0$2 = /*@__PURE__*/ new Vector3();\nconst _v1$7 = /*@__PURE__*/ new Vector3();\nconst _v2$4 = /*@__PURE__*/ new Vector3();\n\n// triangle edge vectors\n\nconst _f0 = /*@__PURE__*/ new Vector3();\nconst _f1 = /*@__PURE__*/ new Vector3();\nconst _f2 = /*@__PURE__*/ new Vector3();\n\nconst _center = /*@__PURE__*/ new Vector3();\nconst _extents = /*@__PURE__*/ new Vector3();\nconst _triangleNormal = /*@__PURE__*/ new Vector3();\nconst _testAxis = /*@__PURE__*/ new Vector3();\n\nfunction satForAxes( axes, v0, v1, v2, extents ) {\n\n\tfor ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) {\n\n\t\t_testAxis.fromArray( axes, i );\n\t\t// project the aabb onto the separating axis\n\t\tconst r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z );\n\t\t// project all 3 vertices of the triangle onto the separating axis\n\t\tconst p0 = v0.dot( _testAxis );\n\t\tconst p1 = v1.dot( _testAxis );\n\t\tconst p2 = v2.dot( _testAxis );\n\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\tif ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {\n\n\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t// the axis is separating and we can exit\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nconst _box$2 = /*@__PURE__*/ new Box3();\nconst _v1$6 = /*@__PURE__*/ new Vector3();\nconst _v2$3 = /*@__PURE__*/ new Vector3();\n\nclass Sphere {\n\n\tconstructor( center = new Vector3(), radius = - 1 ) {\n\n\t\tthis.center = center;\n\t\tthis.radius = radius;\n\n\t}\n\n\tset( 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( points, optionalCenter ) {\n\n\t\tconst center = this.center;\n\n\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\tcenter.copy( optionalCenter );\n\n\t\t} else {\n\n\t\t\t_box$2.setFromPoints( points ).getCenter( center );\n\n\t\t}\n\n\t\tlet maxRadiusSq = 0;\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t}\n\n\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( 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\tisEmpty() {\n\n\t\treturn ( this.radius < 0 );\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.center.set( 0, 0, 0 );\n\t\tthis.radius = - 1;\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\tconst radiusSum = this.radius + sphere.radius;\n\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsSphere( this );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\tconst deltaLengthSq = this.center.distanceToSquared( point );\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( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\t// Empty sphere produces empty bounding box\n\t\t\ttarget.makeEmpty();\n\t\t\treturn target;\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( 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( offset ) {\n\n\t\tthis.center.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.center.copy( point );\n\n\t\t\tthis.radius = 0;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\t_v1$6.subVectors( point, this.center );\n\n\t\tconst lengthSq = _v1$6.lengthSq();\n\n\t\tif ( lengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t// calculate the minimal sphere\n\n\t\t\tconst length = Math.sqrt( lengthSq );\n\n\t\t\tconst delta = ( length - this.radius ) * 0.5;\n\n\t\t\tthis.center.addScaledVector( _v1$6, delta / length );\n\n\t\t\tthis.radius += delta;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunion( sphere ) {\n\n\t\tif ( sphere.isEmpty() ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.copy( sphere );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.center.equals( sphere.center ) === true ) {\n\n\t\t\t this.radius = Math.max( this.radius, sphere.radius );\n\n\t\t} else {\n\n\t\t\t_v2$3.subVectors( sphere.center, this.center ).setLength( sphere.radius );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).add( _v2$3 ) );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).sub( _v2$3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tequals( sphere ) {\n\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$9 = /*@__PURE__*/ new Vector3();\nconst _segCenter = /*@__PURE__*/ new Vector3();\nconst _segDir = /*@__PURE__*/ new Vector3();\nconst _diff = /*@__PURE__*/ new Vector3();\n\nconst _edge1 = /*@__PURE__*/ new Vector3();\nconst _edge2 = /*@__PURE__*/ new Vector3();\nconst _normal$1 = /*@__PURE__*/ new Vector3();\n\nclass Ray {\n\n\tconstructor( origin = new Vector3(), direction = new Vector3( 0, 0, - 1 ) ) {\n\n\t\tthis.origin = origin;\n\t\tthis.direction = direction;\n\n\t}\n\n\tset( 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\tcopy( 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( t, target ) {\n\n\t\treturn target.copy( this.origin ).addScaledVector( this.direction, t );\n\n\t}\n\n\tlookAt( v ) {\n\n\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\trecast( t ) {\n\n\t\tthis.origin.copy( this.at( t, _vector$9 ) );\n\n\t\treturn this;\n\n\t}\n\n\tclosestPointToPoint( point, target ) {\n\n\t\ttarget.subVectors( point, this.origin );\n\n\t\tconst 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.origin ).addScaledVector( this.direction, directionDistance );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t}\n\n\tdistanceSqToPoint( point ) {\n\n\t\tconst directionDistance = _vector$9.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t// point behind the ray\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t}\n\n\t\t_vector$9.copy( this.origin ).addScaledVector( this.direction, directionDistance );\n\n\t\treturn _vector$9.distanceToSquared( point );\n\n\t}\n\n\tdistanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t// It returns the min distance between the ray and the segment\n\t\t// defined by v0 and v1\n\t\t// It can also set two optional targets :\n\t\t// - The closest point on the ray\n\t\t// - The closest point on the segment\n\n\t\t_segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t_segDir.copy( v1 ).sub( v0 ).normalize();\n\t\t_diff.copy( this.origin ).sub( _segCenter );\n\n\t\tconst segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\tconst a01 = - this.direction.dot( _segDir );\n\t\tconst b0 = _diff.dot( this.direction );\n\t\tconst b1 = - _diff.dot( _segDir );\n\t\tconst c = _diff.lengthSq();\n\t\tconst det = Math.abs( 1 - a01 * a01 );\n\t\tlet s0, s1, sqrDist, extDet;\n\n\t\tif ( det > 0 ) {\n\n\t\t\t// The ray and segment are not parallel.\n\n\t\t\ts0 = a01 * b1 - b0;\n\t\t\ts1 = a01 * b0 - b1;\n\t\t\textDet = segExtent * det;\n\n\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\tconst invDet = 1 / det;\n\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\ts1 *= invDet;\n\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} else {\n\n\t\t\t\t\t\t// region 1\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\t// region 5\n\n\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t// region 4\n\n\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t// region 3\n\n\t\t\t\t\ts0 = 0;\n\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 2\n\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Ray and segment are parallel.\n\n\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t}\n\n\t\tif ( optionalPointOnRay ) {\n\n\t\t\toptionalPointOnRay.copy( this.origin ).addScaledVector( this.direction, s0 );\n\n\t\t}\n\n\t\tif ( optionalPointOnSegment ) {\n\n\t\t\toptionalPointOnSegment.copy( _segCenter ).addScaledVector( _segDir, s1 );\n\n\t\t}\n\n\t\treturn sqrDist;\n\n\t}\n\n\tintersectSphere( sphere, target ) {\n\n\t\t_vector$9.subVectors( sphere.center, this.origin );\n\t\tconst tca = _vector$9.dot( this.direction );\n\t\tconst d2 = _vector$9.dot( _vector$9 ) - tca * tca;\n\t\tconst radius2 = sphere.radius * sphere.radius;\n\n\t\tif ( d2 > radius2 ) return null;\n\n\t\tconst thc = Math.sqrt( radius2 - d2 );\n\n\t\t// t0 = first intersect point - entrance on front of sphere\n\t\tconst t0 = tca - thc;\n\n\t\t// t1 = second intersect point - exit point on back of sphere\n\t\tconst t1 = tca + thc;\n\n\t\t// test to see if t1 is behind the ray - if so, return null\n\t\tif ( t1 < 0 ) return null;\n\n\t\t// test to see if t0 is behind the ray:\n\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t// in order to always return an intersect point that is in front of the ray.\n\t\tif ( t0 < 0 ) return this.at( t1, target );\n\n\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\treturn this.at( t0, target );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\tdistanceToPlane( plane ) {\n\n\t\tconst 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\tconst 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( plane, target ) {\n\n\t\tconst 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( plane ) {\n\n\t\t// check if the ray lies on the plane first\n\n\t\tconst distToPoint = plane.distanceToPoint( this.origin );\n\n\t\tif ( distToPoint === 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst 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( box, target ) {\n\n\t\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tconst invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tconst 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\tif ( tymin > tmin || isNaN( tmin ) ) tmin = tymin;\n\n\t\tif ( tymax < tmax || isNaN( 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( box ) {\n\n\t\treturn this.intersectBox( box, _vector$9 ) !== null;\n\n\t}\n\n\tintersectTriangle( a, b, c, backfaceCulling, target ) {\n\n\t\t// Compute the offset origin, edges, and normal.\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t_edge1.subVectors( b, a );\n\t\t_edge2.subVectors( c, a );\n\t\t_normal$1.crossVectors( _edge1, _edge2 );\n\n\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\tlet DdN = this.direction.dot( _normal$1 );\n\t\tlet sign;\n\n\t\tif ( DdN > 0 ) {\n\n\t\t\tif ( backfaceCulling ) return null;\n\t\t\tsign = 1;\n\n\t\t} else if ( DdN < 0 ) {\n\n\t\t\tsign = - 1;\n\t\t\tDdN = - DdN;\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t_diff.subVectors( this.origin, a );\n\t\tconst DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) );\n\n\t\t// b1 < 0, no intersection\n\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) );\n\n\t\t// b2 < 0, no intersection\n\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// b1+b2 > 1, no intersection\n\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Line intersects triangle, check if ray does.\n\t\tconst QdN = - sign * _diff.dot( _normal$1 );\n\n\t\t// t < 0, no intersection\n\t\tif ( QdN < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Ray intersects triangle.\n\t\treturn this.at( QdN / DdN, target );\n\n\t}\n\n\tapplyMatrix4( 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( ray ) {\n\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nclass Matrix4 {\n\n\tconstructor( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tMatrix4.prototype.isMatrix4 = true;\n\n\t\tthis.elements = [\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\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 );\n\n\t\t}\n\n\t}\n\n\tset( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tconst 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() {\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() {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t}\n\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst 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( m ) {\n\n\t\tconst 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\tsetFromMatrix3( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 3 ], me[ 6 ], 0,\n\t\t\tme[ 1 ], me[ 4 ], me[ 7 ], 0,\n\t\t\tme[ 2 ], me[ 5 ], me[ 8 ], 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\textractBasis( 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( 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( m ) {\n\n\t\t// this method does not support reflection matrices\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tconst scaleX = 1 / _v1$5.setFromMatrixColumn( m, 0 ).length();\n\t\tconst scaleY = 1 / _v1$5.setFromMatrixColumn( m, 1 ).length();\n\t\tconst scaleZ = 1 / _v1$5.setFromMatrixColumn( m, 2 ).length();\n\n\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\t\tte[ 11 ] = 0;\n\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\tmakeRotationFromEuler( euler ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = euler.x, y = euler.y, z = euler.z;\n\t\tconst a = Math.cos( x ), b = Math.sin( x );\n\t\tconst c = Math.cos( y ), d = Math.sin( y );\n\t\tconst e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tconst 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\tconst 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\tconst 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\tconst 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\tconst 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\tconst 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// bottom row\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// last column\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( q ) {\n\n\t\treturn this.compose( _zero, q, _one );\n\n\t}\n\n\tlookAt( eye, target, up ) {\n\n\t\tconst te = this.elements;\n\n\t\t_z.subVectors( eye, target );\n\n\t\tif ( _z.lengthSq() === 0 ) {\n\n\t\t\t// eye and target are in the same position\n\n\t\t\t_z.z = 1;\n\n\t\t}\n\n\t\t_z.normalize();\n\t\t_x.crossVectors( up, _z );\n\n\t\tif ( _x.lengthSq() === 0 ) {\n\n\t\t\t// up and z are parallel\n\n\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t_z.x += 0.0001;\n\n\t\t\t} else {\n\n\t\t\t\t_z.z += 0.0001;\n\n\t\t\t}\n\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors( up, _z );\n\n\t\t}\n\n\t\t_x.normalize();\n\t\t_y.crossVectors( _z, _x );\n\n\t\tte[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x;\n\t\tte[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y;\n\t\tte[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tconst a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tconst 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( s ) {\n\n\t\tconst 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\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tconst n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tconst n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tconst 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() {\n\n\t\tconst te = this.elements;\n\t\tlet 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( x, y, z ) {\n\n\t\tconst te = this.elements;\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tte[ 12 ] = x.x;\n\t\t\tte[ 13 ] = x.y;\n\t\t\tte[ 14 ] = x.z;\n\n\t\t} else {\n\n\t\t\tte[ 12 ] = x;\n\t\t\tte[ 13 ] = y;\n\t\t\tte[ 14 ] = z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tinvert() {\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],\n\t\t\tn12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],\n\t\t\tn13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],\n\t\t\tn14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 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\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst 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( v ) {\n\n\t\tconst te = this.elements;\n\t\tconst 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() {\n\n\t\tconst te = this.elements;\n\n\t\tconst scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tconst scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tconst 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( x, y, z ) {\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x.x,\n\t\t\t\t0, 1, 0, x.y,\n\t\t\t\t0, 0, 1, x.z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x,\n\t\t\t\t0, 1, 0, y,\n\t\t\t\t0, 0, 1, z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationX( theta ) {\n\n\t\tconst 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( theta ) {\n\n\t\tconst 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( theta ) {\n\n\t\tconst 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( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tconst c = Math.cos( angle );\n\t\tconst s = Math.sin( angle );\n\t\tconst t = 1 - c;\n\t\tconst x = axis.x, y = axis.y, z = axis.z;\n\t\tconst 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\treturn this;\n\n\t}\n\n\tmakeScale( 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( xy, xz, yx, yz, zx, zy ) {\n\n\t\tthis.set(\n\n\t\t\t1, yx, zx, 0,\n\t\t\txy, 1, zy, 0,\n\t\t\txz, yz, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tcompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tconst x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tconst sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[ 0 ] = ( 1 - ( yy + zz ) ) * sx;\n\t\tte[ 1 ] = ( xy + wz ) * sx;\n\t\tte[ 2 ] = ( xz - wy ) * sx;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = ( xy - wz ) * sy;\n\t\tte[ 5 ] = ( 1 - ( xx + zz ) ) * sy;\n\t\tte[ 6 ] = ( yz + wx ) * sy;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = ( xz + wy ) * sz;\n\t\tte[ 9 ] = ( yz - wx ) * sz;\n\t\tte[ 10 ] = ( 1 - ( xx + yy ) ) * sz;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = position.x;\n\t\tte[ 13 ] = position.y;\n\t\tte[ 14 ] = position.z;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tdecompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tlet sx = _v1$5.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\tconst sy = _v1$5.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\tconst sz = _v1$5.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t// if determine is negative, we need to invert one scale\n\t\tconst det = this.determinant();\n\t\tif ( det < 0 ) sx = - sx;\n\n\t\tposition.x = te[ 12 ];\n\t\tposition.y = te[ 13 ];\n\t\tposition.z = te[ 14 ];\n\n\t\t// scale the rotation part\n\t\t_m1$2.copy( this );\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\t_m1$2.elements[ 0 ] *= invSX;\n\t\t_m1$2.elements[ 1 ] *= invSX;\n\t\t_m1$2.elements[ 2 ] *= invSX;\n\n\t\t_m1$2.elements[ 4 ] *= invSY;\n\t\t_m1$2.elements[ 5 ] *= invSY;\n\t\t_m1$2.elements[ 6 ] *= invSY;\n\n\t\t_m1$2.elements[ 8 ] *= invSZ;\n\t\t_m1$2.elements[ 9 ] *= invSZ;\n\t\t_m1$2.elements[ 10 ] *= invSZ;\n\n\t\tquaternion.setFromRotationMatrix( _m1$2 );\n\n\t\tscale.x = sx;\n\t\tscale.y = sy;\n\t\tscale.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\tmakePerspective( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = 2 * near / ( right - left );\n\t\tconst y = 2 * near / ( top - bottom );\n\n\t\tconst a = ( right + left ) / ( right - left );\n\t\tconst b = ( top + bottom ) / ( top - bottom );\n\n\t\tlet c, d;\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tc = - ( far + near ) / ( far - near );\n\t\t\td = ( - 2 * far * near ) / ( far - near );\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tc = - far / ( far - near );\n\t\t\td = ( - far * near ) / ( far - near );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.Matrix4.makePerspective(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\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( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem ) {\n\n\t\tconst te = this.elements;\n\t\tconst w = 1.0 / ( right - left );\n\t\tconst h = 1.0 / ( top - bottom );\n\t\tconst p = 1.0 / ( far - near );\n\n\t\tconst x = ( right + left ) * w;\n\t\tconst y = ( top + bottom ) * h;\n\n\t\tlet z, zInv;\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tz = ( far + near ) * p;\n\t\t\tzInv = - 2 * p;\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tz = near * p;\n\t\t\tzInv = - 1 * p;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.Matrix4.makeOrthographic(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\t\tte[ 8 ] = 0; \t\tte[ 12 ] = - x;\n\t\tte[ 1 ] = 0; \t\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0; \t\tte[ 13 ] = - y;\n\t\tte[ 2 ] = 0; \t\tte[ 6 ] = 0;\t\tte[ 10 ] = zInv;\tte[ 14 ] = - z;\n\t\tte[ 3 ] = 0; \t\tte[ 7 ] = 0;\t\tte[ 11 ] = 0;\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let 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( array, offset = 0 ) {\n\n\t\tfor ( let 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( array = [], offset = 0 ) {\n\n\t\tconst 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\nconst _v1$5 = /*@__PURE__*/ new Vector3();\nconst _m1$2 = /*@__PURE__*/ new Matrix4();\nconst _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 );\nconst _one = /*@__PURE__*/ new Vector3( 1, 1, 1 );\nconst _x = /*@__PURE__*/ new Vector3();\nconst _y = /*@__PURE__*/ new Vector3();\nconst _z = /*@__PURE__*/ new Vector3();\n\nconst _matrix = /*@__PURE__*/ new Matrix4();\nconst _quaternion$3 = /*@__PURE__*/ new Quaternion();\n\nclass Euler {\n\n\tconstructor( x = 0, y = 0, z = 0, order = Euler.DEFAULT_ORDER ) {\n\n\t\tthis.isEuler = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget order() {\n\n\t\treturn this._order;\n\n\t}\n\n\tset order( value ) {\n\n\t\tthis._order = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( x, y, z, order = this._order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t}\n\n\tcopy( 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( m, order = this._order, update = true ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements;\n\t\tconst m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tconst m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tconst m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromQuaternion( q, order, update ) {\n\n\t\t_matrix.makeRotationFromQuaternion( q );\n\n\t\treturn this.setFromRotationMatrix( _matrix, order, update );\n\n\t}\n\n\tsetFromVector3( v, order = this._order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order );\n\n\t}\n\n\treorder( newOrder ) {\n\n\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t_quaternion$3.setFromEuler( this );\n\n\t\treturn this.setFromQuaternion( _quaternion$3, newOrder );\n\n\t}\n\n\tequals( 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( 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( array = [], 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\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._order;\n\n\t}\n\n}\n\nEuler.DEFAULT_ORDER = 'XYZ';\n\nclass Layers {\n\n\tconstructor() {\n\n\t\tthis.mask = 1 | 0;\n\n\t}\n\n\tset( channel ) {\n\n\t\tthis.mask = ( 1 << channel | 0 ) >>> 0;\n\n\t}\n\n\tenable( channel ) {\n\n\t\tthis.mask |= 1 << channel | 0;\n\n\t}\n\n\tenableAll() {\n\n\t\tthis.mask = 0xffffffff | 0;\n\n\t}\n\n\ttoggle( channel ) {\n\n\t\tthis.mask ^= 1 << channel | 0;\n\n\t}\n\n\tdisable( channel ) {\n\n\t\tthis.mask &= ~ ( 1 << channel | 0 );\n\n\t}\n\n\tdisableAll() {\n\n\t\tthis.mask = 0;\n\n\t}\n\n\ttest( layers ) {\n\n\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t}\n\n\tisEnabled( channel ) {\n\n\t\treturn ( this.mask & ( 1 << channel | 0 ) ) !== 0;\n\n\t}\n\n}\n\nlet _object3DId = 0;\n\nconst _v1$4 = /*@__PURE__*/ new Vector3();\nconst _q1 = /*@__PURE__*/ new Quaternion();\nconst _m1$1 = /*@__PURE__*/ new Matrix4();\nconst _target = /*@__PURE__*/ new Vector3();\n\nconst _position$3 = /*@__PURE__*/ new Vector3();\nconst _scale$2 = /*@__PURE__*/ new Vector3();\nconst _quaternion$2 = /*@__PURE__*/ new Quaternion();\n\nconst _xAxis = /*@__PURE__*/ new Vector3( 1, 0, 0 );\nconst _yAxis = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nconst _zAxis = /*@__PURE__*/ new Vector3( 0, 0, 1 );\n\nconst _addedEvent = { type: 'added' };\nconst _removedEvent = { type: 'removed' };\n\nclass Object3D extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isObject3D = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _object3DId ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Object3D';\n\n\t\tthis.parent = null;\n\t\tthis.children = [];\n\n\t\tthis.up = Object3D.DEFAULT_UP.clone();\n\n\t\tconst position = new Vector3();\n\t\tconst rotation = new Euler();\n\t\tconst quaternion = new Quaternion();\n\t\tconst scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation._onChange( onRotationChange );\n\t\tquaternion._onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\tposition: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\trotation: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\tquaternion: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\tscale: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\tthis.matrix = new Matrix4();\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\tthis.matrixAutoUpdate = Object3D.DEFAULT_MATRIX_AUTO_UPDATE;\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\tthis.matrixWorldAutoUpdate = Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE; // checked by the renderer\n\n\t\tthis.layers = new Layers();\n\t\tthis.visible = true;\n\n\t\tthis.castShadow = false;\n\t\tthis.receiveShadow = false;\n\n\t\tthis.frustumCulled = true;\n\t\tthis.renderOrder = 0;\n\n\t\tthis.animations = [];\n\n\t\tthis.userData = {};\n\n\t}\n\n\tonBeforeRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\tonAfterRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tthis.matrix.premultiply( matrix );\n\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\tthis.quaternion.premultiply( q );\n\n\t\treturn this;\n\n\t}\n\n\tsetRotationFromAxisAngle( axis, angle ) {\n\n\t\t// assumes axis is normalized\n\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t}\n\n\tsetRotationFromEuler( euler ) {\n\n\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t}\n\n\tsetRotationFromMatrix( 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( q ) {\n\n\t\t// assumes q is normalized\n\n\t\tthis.quaternion.copy( q );\n\n\t}\n\n\trotateOnAxis( axis, angle ) {\n\n\t\t// rotate object on axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.multiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateOnWorldAxis( axis, angle ) {\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\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.premultiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateX( angle ) {\n\n\t\treturn this.rotateOnAxis( _xAxis, angle );\n\n\t}\n\n\trotateY( angle ) {\n\n\t\treturn this.rotateOnAxis( _yAxis, angle );\n\n\t}\n\n\trotateZ( angle ) {\n\n\t\treturn this.rotateOnAxis( _zAxis, angle );\n\n\t}\n\n\ttranslateOnAxis( axis, distance ) {\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\t_v1$4.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\tthis.position.add( _v1$4.multiplyScalar( distance ) );\n\n\t\treturn this;\n\n\t}\n\n\ttranslateX( distance ) {\n\n\t\treturn this.translateOnAxis( _xAxis, distance );\n\n\t}\n\n\ttranslateY( distance ) {\n\n\t\treturn this.translateOnAxis( _yAxis, distance );\n\n\t}\n\n\ttranslateZ( distance ) {\n\n\t\treturn this.translateOnAxis( _zAxis, distance );\n\n\t}\n\n\tlocalToWorld( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t}\n\n\tworldToLocal( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( _m1$1.copy( this.matrixWorld ).invert() );\n\n\t}\n\n\tlookAt( x, y, z ) {\n\n\t\t// This method does not support objects having non-uniformly-scaled parent(s)\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\t_target.copy( x );\n\n\t\t} else {\n\n\t\t\t_target.set( x, y, z );\n\n\t\t}\n\n\t\tconst parent = this.parent;\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_position$3.setFromMatrixPosition( this.matrixWorld );\n\n\t\tif ( this.isCamera || this.isLight ) {\n\n\t\t\t_m1$1.lookAt( _position$3, _target, this.up );\n\n\t\t} else {\n\n\t\t\t_m1$1.lookAt( _target, _position$3, this.up );\n\n\t\t}\n\n\t\tthis.quaternion.setFromRotationMatrix( _m1$1 );\n\n\t\tif ( parent ) {\n\n\t\t\t_m1$1.extractRotation( parent.matrixWorld );\n\t\t\t_q1.setFromRotationMatrix( _m1$1 );\n\t\t\tthis.quaternion.premultiply( _q1.invert() );\n\n\t\t}\n\n\t}\n\n\tadd( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let 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\tthis.children.push( object );\n\n\t\t\tobject.dispatchEvent( _addedEvent );\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( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let 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\tconst index = this.children.indexOf( object );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\tobject.parent = null;\n\t\t\tthis.children.splice( index, 1 );\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremoveFromParent() {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tparent.remove( this );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclear() {\n\n\t\treturn this.remove( ... this.children );\n\n\t}\n\n\tattach( object ) {\n\n\t\t// adds object as a child of this, while maintaining the object's world transform\n\n\t\t// Note: This method does not support scene graphs having non-uniformly-scaled nodes(s)\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_m1$1.copy( this.matrixWorld ).invert();\n\n\t\tif ( object.parent !== null ) {\n\n\t\t\tobject.parent.updateWorldMatrix( true, false );\n\n\t\t\t_m1$1.multiply( object.parent.matrixWorld );\n\n\t\t}\n\n\t\tobject.applyMatrix4( _m1$1 );\n\n\t\tthis.add( object );\n\n\t\tobject.updateWorldMatrix( false, true );\n\n\t\treturn this;\n\n\t}\n\n\tgetObjectById( id ) {\n\n\t\treturn this.getObjectByProperty( 'id', id );\n\n\t}\n\n\tgetObjectByName( name ) {\n\n\t\treturn this.getObjectByProperty( 'name', name );\n\n\t}\n\n\tgetObjectByProperty( name, value ) {\n\n\t\tif ( this[ name ] === value ) return this;\n\n\t\tfor ( let i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = this.children[ i ];\n\t\t\tconst 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\tgetObjectsByProperty( name, value ) {\n\n\t\tlet result = [];\n\n\t\tif ( this[ name ] === value ) result.push( this );\n\n\t\tfor ( let i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tconst childResult = this.children[ i ].getObjectsByProperty( name, value );\n\n\t\t\tif ( childResult.length > 0 ) {\n\n\t\t\t\tresult = result.concat( childResult );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tgetWorldPosition( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn target.setFromMatrixPosition( this.matrixWorld );\n\n\t}\n\n\tgetWorldQuaternion( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, target, _scale$2 );\n\n\t\treturn target;\n\n\t}\n\n\tgetWorldScale( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, _quaternion$2, target );\n\n\t\treturn target;\n\n\t}\n\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();\n\n\t}\n\n\traycast( /* raycaster, intersects */ ) {}\n\n\ttraverse( callback ) {\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let 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( callback ) {\n\n\t\tif ( this.visible === false ) return;\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let 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( callback ) {\n\n\t\tconst 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() {\n\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\tupdateMatrixWorld( 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\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tconst child = children[ i ];\n\n\t\t\tif ( child.matrixWorldAutoUpdate === true || force === true ) {\n\n\t\t\t\tchild.updateMatrixWorld( force );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( updateParents === true && parent !== null && parent.matrixWorldAutoUpdate === true ) {\n\n\t\t\tparent.updateWorldMatrix( true, false );\n\n\t\t}\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.parent === null ) {\n\n\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t} else {\n\n\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t}\n\n\t\t// update children\n\n\t\tif ( updateChildren === true ) {\n\n\t\t\tconst children = this.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = children[ i ];\n\n\t\t\t\tif ( child.matrixWorldAutoUpdate === true ) {\n\n\t\t\t\t\tchild.updateWorldMatrix( false, true );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\t// meta is a string when called from JSON.stringify\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tconst 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\tskeletons: {},\n\t\t\t\tanimations: {},\n\t\t\t\tnodes: {}\n\t\t\t};\n\n\t\t\toutput.metadata = {\n\t\t\t\tversion: 4.6,\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\tconst 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 ( Object.keys( this.userData ).length > 0 ) object.userData = this.userData;\n\n\t\tobject.layers = this.layers.mask;\n\t\tobject.matrix = this.matrix.toArray();\n\t\tobject.up = this.up.toArray();\n\n\t\tif ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;\n\n\t\t// object specific properties\n\n\t\tif ( this.isInstancedMesh ) {\n\n\t\t\tobject.type = 'InstancedMesh';\n\t\t\tobject.count = this.count;\n\t\t\tobject.instanceMatrix = this.instanceMatrix.toJSON();\n\t\t\tif ( this.instanceColor !== null ) object.instanceColor = this.instanceColor.toJSON();\n\n\t\t}\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.isScene ) {\n\n\t\t\tif ( this.background ) {\n\n\t\t\t\tif ( this.background.isColor ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON();\n\n\t\t\t\t} else if ( this.background.isTexture ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON( meta ).uuid;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.environment && this.environment.isTexture && this.environment.isRenderTargetTexture !== true ) {\n\n\t\t\t\tobject.environment = this.environment.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t} else if ( this.isMesh || this.isLine || this.isPoints ) {\n\n\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\tconst parameters = this.geometry.parameters;\n\n\t\t\tif ( parameters !== undefined && parameters.shapes !== undefined ) {\n\n\t\t\t\tconst shapes = parameters.shapes;\n\n\t\t\t\tif ( Array.isArray( shapes ) ) {\n\n\t\t\t\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst 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.isSkinnedMesh ) {\n\n\t\t\tobject.bindMode = this.bindMode;\n\t\t\tobject.bindMatrix = this.bindMatrix.toArray();\n\n\t\t\tif ( this.skeleton !== undefined ) {\n\n\t\t\t\tserialize( meta.skeletons, this.skeleton );\n\n\t\t\t\tobject.skeleton = this.skeleton.uuid;\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\tconst uuids = [];\n\n\t\t\t\tfor ( let 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 ( let 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\t//\n\n\t\tif ( this.animations.length > 0 ) {\n\n\t\t\tobject.animations = [];\n\n\t\t\tfor ( let i = 0; i < this.animations.length; i ++ ) {\n\n\t\t\t\tconst animation = this.animations[ i ];\n\n\t\t\t\tobject.animations.push( serialize( meta.animations, animation ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst geometries = extractFromCache( meta.geometries );\n\t\t\tconst materials = extractFromCache( meta.materials );\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\t\t\tconst shapes = extractFromCache( meta.shapes );\n\t\t\tconst skeletons = extractFromCache( meta.skeletons );\n\t\t\tconst animations = extractFromCache( meta.animations );\n\t\t\tconst nodes = extractFromCache( meta.nodes );\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\t\t\tif ( skeletons.length > 0 ) output.skeletons = skeletons;\n\t\t\tif ( animations.length > 0 ) output.animations = animations;\n\t\t\tif ( nodes.length > 0 ) output.nodes = nodes;\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\tconst values = [];\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst 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}\n\n\tclone( recursive ) {\n\n\t\treturn new this.constructor().copy( this, recursive );\n\n\t}\n\n\tcopy( source, 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.rotation.order = source.rotation.order;\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.matrixWorldAutoUpdate = source.matrixWorldAutoUpdate;\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.animations = source.animations.slice();\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tfor ( let i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\tconst 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\nObject3D.DEFAULT_UP = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nObject3D.DEFAULT_MATRIX_AUTO_UPDATE = true;\nObject3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE = true;\n\nconst _v0$1 = /*@__PURE__*/ new Vector3();\nconst _v1$3 = /*@__PURE__*/ new Vector3();\nconst _v2$2 = /*@__PURE__*/ new Vector3();\nconst _v3$1 = /*@__PURE__*/ new Vector3();\n\nconst _vab = /*@__PURE__*/ new Vector3();\nconst _vac = /*@__PURE__*/ new Vector3();\nconst _vbc = /*@__PURE__*/ new Vector3();\nconst _vap = /*@__PURE__*/ new Vector3();\nconst _vbp = /*@__PURE__*/ new Vector3();\nconst _vcp = /*@__PURE__*/ new Vector3();\n\nlet warnedGetUV = false;\n\nclass Triangle {\n\n\tconstructor( a = new Vector3(), b = new Vector3(), c = new Vector3() ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t}\n\n\tstatic getNormal( a, b, c, target ) {\n\n\t\ttarget.subVectors( c, b );\n\t\t_v0$1.subVectors( a, b );\n\t\ttarget.cross( _v0$1 );\n\n\t\tconst targetLengthSq = target.lengthSq();\n\t\tif ( targetLengthSq > 0 ) {\n\n\t\t\treturn target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );\n\n\t\t}\n\n\t\treturn target.set( 0, 0, 0 );\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\tstatic getBarycoord( point, a, b, c, target ) {\n\n\t\t_v0$1.subVectors( c, a );\n\t\t_v1$3.subVectors( b, a );\n\t\t_v2$2.subVectors( point, a );\n\n\t\tconst dot00 = _v0$1.dot( _v0$1 );\n\t\tconst dot01 = _v0$1.dot( _v1$3 );\n\t\tconst dot02 = _v0$1.dot( _v2$2 );\n\t\tconst dot11 = _v1$3.dot( _v1$3 );\n\t\tconst dot12 = _v1$3.dot( _v2$2 );\n\n\t\tconst denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t// collinear or singular triangle\n\t\tif ( denom === 0 ) {\n\n\t\t\t// arbitrary location outside of triangle?\n\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\treturn target.set( - 2, - 1, - 1 );\n\n\t\t}\n\n\t\tconst invDenom = 1 / denom;\n\t\tconst u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\tconst v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t// barycentric coordinates must always sum to 1\n\t\treturn target.set( 1 - u - v, v, u );\n\n\t}\n\n\tstatic containsPoint( point, a, b, c ) {\n\n\t\tthis.getBarycoord( point, a, b, c, _v3$1 );\n\n\t\treturn ( _v3$1.x >= 0 ) && ( _v3$1.y >= 0 ) && ( ( _v3$1.x + _v3$1.y ) <= 1 );\n\n\t}\n\n\tstatic getUV( point, p1, p2, p3, uv1, uv2, uv3, target ) { // @deprecated, r151\n\n\t\tif ( warnedGetUV === false ) {\n\n\t\t\tconsole.warn( 'THREE.Triangle.getUV() has been renamed to THREE.Triangle.getInterpolation().' );\n\n\t\t\twarnedGetUV = true;\n\n\t\t}\n\n\t\treturn this.getInterpolation( point, p1, p2, p3, uv1, uv2, uv3, target );\n\n\t}\n\n\tstatic getInterpolation( point, p1, p2, p3, v1, v2, v3, target ) {\n\n\t\tthis.getBarycoord( point, p1, p2, p3, _v3$1 );\n\n\t\ttarget.setScalar( 0 );\n\t\ttarget.addScaledVector( v1, _v3$1.x );\n\t\ttarget.addScaledVector( v2, _v3$1.y );\n\t\ttarget.addScaledVector( v3, _v3$1.z );\n\n\t\treturn target;\n\n\t}\n\n\tstatic isFrontFacing( a, b, c, direction ) {\n\n\t\t_v0$1.subVectors( c, b );\n\t\t_v1$3.subVectors( a, b );\n\n\t\t// strictly front facing\n\t\treturn ( _v0$1.cross( _v1$3 ).dot( direction ) < 0 ) ? true : false;\n\n\t}\n\n\tset( 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( 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\tsetFromAttributeAndIndices( attribute, i0, i1, i2 ) {\n\n\t\tthis.a.fromBufferAttribute( attribute, i0 );\n\t\tthis.b.fromBufferAttribute( attribute, i1 );\n\t\tthis.c.fromBufferAttribute( attribute, i2 );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( 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() {\n\n\t\t_v0$1.subVectors( this.c, this.b );\n\t\t_v1$3.subVectors( this.a, this.b );\n\n\t\treturn _v0$1.cross( _v1$3 ).length() * 0.5;\n\n\t}\n\n\tgetMidpoint( target ) {\n\n\t\treturn target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t}\n\n\tgetNormal( target ) {\n\n\t\treturn Triangle.getNormal( this.a, this.b, this.c, target );\n\n\t}\n\n\tgetPlane( target ) {\n\n\t\treturn target.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t}\n\n\tgetBarycoord( point, target ) {\n\n\t\treturn Triangle.getBarycoord( point, this.a, this.b, this.c, target );\n\n\t}\n\n\tgetUV( point, uv1, uv2, uv3, target ) { // @deprecated, r151\n\n\t\tif ( warnedGetUV === false ) {\n\n\t\t\tconsole.warn( 'THREE.Triangle.getUV() has been renamed to THREE.Triangle.getInterpolation().' );\n\n\t\t\twarnedGetUV = true;\n\n\t\t}\n\n\t\treturn Triangle.getInterpolation( point, this.a, this.b, this.c, uv1, uv2, uv3, target );\n\n\t}\n\n\tgetInterpolation( point, v1, v2, v3, target ) {\n\n\t\treturn Triangle.getInterpolation( point, this.a, this.b, this.c, v1, v2, v3, target );\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t}\n\n\tisFrontFacing( direction ) {\n\n\t\treturn Triangle.isFrontFacing( this.a, this.b, this.c, direction );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsTriangle( this );\n\n\t}\n\n\tclosestPointToPoint( p, target ) {\n\n\t\tconst a = this.a, b = this.b, c = this.c;\n\t\tlet v, w;\n\n\t\t// algorithm thanks to Real-Time Collision Detection by Christer Ericson,\n\t\t// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,\n\t\t// under the accompanying license; see chapter 5.1.5 for detailed explanation.\n\t\t// basically, we're distinguishing which of the voronoi regions of the triangle\n\t\t// the point lies in with the minimum amount of redundant computation.\n\n\t\t_vab.subVectors( b, a );\n\t\t_vac.subVectors( c, a );\n\t\t_vap.subVectors( p, a );\n\t\tconst d1 = _vab.dot( _vap );\n\t\tconst d2 = _vac.dot( _vap );\n\t\tif ( d1 <= 0 && d2 <= 0 ) {\n\n\t\t\t// vertex region of A; barycentric coords (1, 0, 0)\n\t\t\treturn target.copy( a );\n\n\t\t}\n\n\t\t_vbp.subVectors( p, b );\n\t\tconst d3 = _vab.dot( _vbp );\n\t\tconst d4 = _vac.dot( _vbp );\n\t\tif ( d3 >= 0 && d4 <= d3 ) {\n\n\t\t\t// vertex region of B; barycentric coords (0, 1, 0)\n\t\t\treturn target.copy( b );\n\n\t\t}\n\n\t\tconst vc = d1 * d4 - d3 * d2;\n\t\tif ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {\n\n\t\t\tv = d1 / ( d1 - d3 );\n\t\t\t// edge region of AB; barycentric coords (1-v, v, 0)\n\t\t\treturn target.copy( a ).addScaledVector( _vab, v );\n\n\t\t}\n\n\t\t_vcp.subVectors( p, c );\n\t\tconst d5 = _vab.dot( _vcp );\n\t\tconst d6 = _vac.dot( _vcp );\n\t\tif ( d6 >= 0 && d5 <= d6 ) {\n\n\t\t\t// vertex region of C; barycentric coords (0, 0, 1)\n\t\t\treturn target.copy( c );\n\n\t\t}\n\n\t\tconst vb = d5 * d2 - d1 * d6;\n\t\tif ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {\n\n\t\t\tw = d2 / ( d2 - d6 );\n\t\t\t// edge region of AC; barycentric coords (1-w, 0, w)\n\t\t\treturn target.copy( a ).addScaledVector( _vac, w );\n\n\t\t}\n\n\t\tconst va = d3 * d6 - d5 * d4;\n\t\tif ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {\n\n\t\t\t_vbc.subVectors( c, b );\n\t\t\tw = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );\n\t\t\t// edge region of BC; barycentric coords (0, 1-w, w)\n\t\t\treturn target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC\n\n\t\t}\n\n\t\t// face region\n\t\tconst denom = 1 / ( va + vb + vc );\n\t\t// u = va * denom\n\t\tv = vb * denom;\n\t\tw = vc * denom;\n\n\t\treturn target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w );\n\n\t}\n\n\tequals( 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\nconst _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\nconst _hslA = { h: 0, s: 0, l: 0 };\nconst _hslB = { h: 0, s: 0, l: 0 };\n\nfunction hue2rgb( p, q, t ) {\n\n\tif ( t < 0 ) t += 1;\n\tif ( t > 1 ) t -= 1;\n\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\tif ( t < 1 / 2 ) return q;\n\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\treturn p;\n\n}\n\nclass Color {\n\n\tconstructor( r, g, b ) {\n\n\t\tthis.isColor = true;\n\n\t\tthis.r = 1;\n\t\tthis.g = 1;\n\t\tthis.b = 1;\n\n\t\treturn this.set( r, g, b );\n\n\t}\n\n\tset( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\n\t\t\tconst value = r;\n\n\t\t\tif ( value && value.isColor ) {\n\n\t\t\t\tthis.copy( value );\n\n\t\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\t\tthis.setHex( value );\n\n\t\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\t\tthis.setStyle( value );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.setRGB( r, g, b );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( 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( hex, colorSpace = SRGBColorSpace ) {\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\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\tsetRGB( r, g, b, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\tsetHSL( h, s, l, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\th = euclideanModulo( h, 1 );\n\t\ts = clamp( s, 0, 1 );\n\t\tl = clamp( l, 0, 1 );\n\n\t\tif ( s === 0 ) {\n\n\t\t\tthis.r = this.g = this.b = l;\n\n\t\t} else {\n\n\t\t\tconst p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\tconst q = ( 2 * l ) - p;\n\n\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t}\n\n\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\tsetStyle( style, colorSpace = SRGBColorSpace ) {\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\tlet m;\n\n\t\tif ( m = /^(\\w+)\\(([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t// rgb / hsl\n\n\t\t\tlet color;\n\t\t\tconst name = m[ 1 ];\n\t\t\tconst 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 = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setRGB(\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 1 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 2 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 3 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setRGB(\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 1 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 2 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 3 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tcolorSpace\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\tcase 'hsl':\n\t\t\t\tcase 'hsla':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setHSL(\n\t\t\t\t\t\t\tparseFloat( color[ 1 ] ) / 360,\n\t\t\t\t\t\t\tparseFloat( color[ 2 ] ) / 100,\n\t\t\t\t\t\t\tparseFloat( color[ 3 ] ) / 100,\n\t\t\t\t\t\t\tcolorSpace\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\tconsole.warn( 'THREE.Color: Unknown color model ' + style );\n\n\t\t\t}\n\n\t\t} else if ( m = /^\\#([A-Fa-f\\d]+)$/.exec( style ) ) {\n\n\t\t\t// hex color\n\n\t\t\tconst hex = m[ 1 ];\n\t\t\tconst size = hex.length;\n\n\t\t\tif ( size === 3 ) {\n\n\t\t\t\t// #ff0\n\t\t\t\treturn this.setRGB(\n\t\t\t\t\tparseInt( hex.charAt( 0 ), 16 ) / 15,\n\t\t\t\t\tparseInt( hex.charAt( 1 ), 16 ) / 15,\n\t\t\t\t\tparseInt( hex.charAt( 2 ), 16 ) / 15,\n\t\t\t\t\tcolorSpace\n\t\t\t\t);\n\n\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t// #ff0000\n\t\t\t\treturn this.setHex( parseInt( hex, 16 ), colorSpace );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Color: Invalid hex color ' + style );\n\n\t\t\t}\n\n\t\t} else if ( style && style.length > 0 ) {\n\n\t\t\treturn this.setColorName( style, colorSpace );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetColorName( style, colorSpace = SRGBColorSpace ) {\n\n\t\t// color keywords\n\t\tconst hex = _colorKeywords[ style.toLowerCase() ];\n\n\t\tif ( hex !== undefined ) {\n\n\t\t\t// red\n\t\t\tthis.setHex( hex, colorSpace );\n\n\t\t} else {\n\n\t\t\t// unknown color\n\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t}\n\n\tcopy( 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\tcopySRGBToLinear( color ) {\n\n\t\tthis.r = SRGBToLinear( color.r );\n\t\tthis.g = SRGBToLinear( color.g );\n\t\tthis.b = SRGBToLinear( color.b );\n\n\t\treturn this;\n\n\t}\n\n\tcopyLinearToSRGB( color ) {\n\n\t\tthis.r = LinearToSRGB( color.r );\n\t\tthis.g = LinearToSRGB( color.g );\n\t\tthis.b = LinearToSRGB( color.b );\n\n\t\treturn this;\n\n\t}\n\n\tconvertSRGBToLinear() {\n\n\t\tthis.copySRGBToLinear( this );\n\n\t\treturn this;\n\n\t}\n\n\tconvertLinearToSRGB() {\n\n\t\tthis.copyLinearToSRGB( this );\n\n\t\treturn this;\n\n\t}\n\n\tgetHex( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.fromWorkingColorSpace( _color.copy( this ), colorSpace );\n\n\t\treturn Math.round( clamp( _color.r * 255, 0, 255 ) ) * 65536 + Math.round( clamp( _color.g * 255, 0, 255 ) ) * 256 + Math.round( clamp( _color.b * 255, 0, 255 ) );\n\n\t}\n\n\tgetHexString( colorSpace = SRGBColorSpace ) {\n\n\t\treturn ( '000000' + this.getHex( colorSpace ).toString( 16 ) ).slice( - 6 );\n\n\t}\n\n\tgetHSL( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\tColorManagement.fromWorkingColorSpace( _color.copy( this ), colorSpace );\n\n\t\tconst r = _color.r, g = _color.g, b = _color.b;\n\n\t\tconst max = Math.max( r, g, b );\n\t\tconst min = Math.min( r, g, b );\n\n\t\tlet hue, saturation;\n\t\tconst 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\tconst 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\tgetRGB( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tColorManagement.fromWorkingColorSpace( _color.copy( this ), colorSpace );\n\n\t\ttarget.r = _color.r;\n\t\ttarget.g = _color.g;\n\t\ttarget.b = _color.b;\n\n\t\treturn target;\n\n\t}\n\n\tgetStyle( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.fromWorkingColorSpace( _color.copy( this ), colorSpace );\n\n\t\tconst r = _color.r, g = _color.g, b = _color.b;\n\n\t\tif ( colorSpace !== SRGBColorSpace ) {\n\n\t\t\t// Requires CSS Color Module Level 4 (https://www.w3.org/TR/css-color-4/).\n\t\t\treturn `color(${ colorSpace } ${ r.toFixed( 3 ) } ${ g.toFixed( 3 ) } ${ b.toFixed( 3 ) })`;\n\n\t\t}\n\n\t\treturn `rgb(${ Math.round( r * 255 ) },${ Math.round( g * 255 ) },${ Math.round( b * 255 ) })`;\n\n\t}\n\n\toffsetHSL( h, s, l ) {\n\n\t\tthis.getHSL( _hslA );\n\n\t\treturn this.setHSL( _hslA.h + h, _hslA.s + s, _hslA.l + l );\n\n\t}\n\n\tadd( 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( 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( 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( 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( 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( 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( 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\tlerpColors( color1, color2, alpha ) {\n\n\t\tthis.r = color1.r + ( color2.r - color1.r ) * alpha;\n\t\tthis.g = color1.g + ( color2.g - color1.g ) * alpha;\n\t\tthis.b = color1.b + ( color2.b - color1.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpHSL( color, alpha ) {\n\n\t\tthis.getHSL( _hslA );\n\t\tcolor.getHSL( _hslB );\n\n\t\tconst h = lerp( _hslA.h, _hslB.h, alpha );\n\t\tconst s = lerp( _hslA.s, _hslB.s, alpha );\n\t\tconst l = lerp( _hslA.l, _hslB.l, alpha );\n\n\t\tthis.setHSL( h, s, l );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromVector3( v ) {\n\n\t\tthis.r = v.x;\n\t\tthis.g = v.y;\n\t\tthis.b = v.z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst r = this.r, g = this.g, b = this.b;\n\t\tconst e = m.elements;\n\n\t\tthis.r = e[ 0 ] * r + e[ 3 ] * g + e[ 6 ] * b;\n\t\tthis.g = e[ 1 ] * r + e[ 4 ] * g + e[ 7 ] * b;\n\t\tthis.b = e[ 2 ] * r + e[ 5 ] * g + e[ 8 ] * b;\n\n\t\treturn this;\n\n\t}\n\n\tequals( c ) {\n\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t}\n\n\tfromArray( array, 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( array = [], 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\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.r = attribute.getX( index );\n\t\tthis.g = attribute.getY( index );\n\t\tthis.b = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\treturn this.getHex();\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.r;\n\t\tyield this.g;\n\t\tyield this.b;\n\n\t}\n\n}\n\nconst _color = /*@__PURE__*/ new Color();\n\nColor.NAMES = _colorKeywords;\n\nlet _materialId = 0;\n\nclass Material extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isMaterial = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _materialId ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Material';\n\n\t\tthis.blending = NormalBlending;\n\t\tthis.side = FrontSide;\n\t\tthis.vertexColors = false;\n\n\t\tthis.opacity = 1;\n\t\tthis.transparent = false;\n\t\tthis.alphaHash = false;\n\n\t\tthis.blendSrc = SrcAlphaFactor;\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\t\tthis.blendEquation = AddEquation;\n\t\tthis.blendSrcAlpha = null;\n\t\tthis.blendDstAlpha = null;\n\t\tthis.blendEquationAlpha = null;\n\t\tthis.blendColor = new Color( 0, 0, 0 );\n\t\tthis.blendAlpha = 0;\n\n\t\tthis.depthFunc = LessEqualDepth;\n\t\tthis.depthTest = true;\n\t\tthis.depthWrite = true;\n\n\t\tthis.stencilWriteMask = 0xff;\n\t\tthis.stencilFunc = AlwaysStencilFunc;\n\t\tthis.stencilRef = 0;\n\t\tthis.stencilFuncMask = 0xff;\n\t\tthis.stencilFail = KeepStencilOp;\n\t\tthis.stencilZFail = KeepStencilOp;\n\t\tthis.stencilZPass = KeepStencilOp;\n\t\tthis.stencilWrite = false;\n\n\t\tthis.clippingPlanes = null;\n\t\tthis.clipIntersection = false;\n\t\tthis.clipShadows = false;\n\n\t\tthis.shadowSide = null;\n\n\t\tthis.colorWrite = true;\n\n\t\tthis.precision = null; // override the renderer's default precision for this material\n\n\t\tthis.polygonOffset = false;\n\t\tthis.polygonOffsetFactor = 0;\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\tthis.dithering = false;\n\n\t\tthis.alphaToCoverage = false;\n\t\tthis.premultipliedAlpha = false;\n\t\tthis.forceSinglePass = false;\n\n\t\tthis.visible = true;\n\n\t\tthis.toneMapped = true;\n\n\t\tthis.userData = {};\n\n\t\tthis.version = 0;\n\n\t\tthis._alphaTest = 0;\n\n\t}\n\n\tget alphaTest() {\n\n\t\treturn this._alphaTest;\n\n\t}\n\n\tset alphaTest( value ) {\n\n\t\tif ( this._alphaTest > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._alphaTest = value;\n\n\t}\n\n\tonBuild( /* shaderobject, renderer */ ) {}\n\n\tonBeforeRender( /* renderer, scene, camera, geometry, object, group */ ) {}\n\n\tonBeforeCompile( /* shaderobject, renderer */ ) {}\n\n\tcustomProgramCacheKey() {\n\n\t\treturn this.onBeforeCompile.toString();\n\n\t}\n\n\tsetValues( values ) {\n\n\t\tif ( values === undefined ) return;\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\tconsole.warn( `THREE.Material: parameter '${ key }' has value of undefined.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\tconsole.warn( `THREE.Material: '${ key }' is not a property of THREE.${ this.type }.` );\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 {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRootObject ) {\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\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.6,\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.sheen !== undefined ) data.sheen = this.sheen;\n\t\tif ( this.sheenColor && this.sheenColor.isColor ) data.sheenColor = this.sheenColor.getHex();\n\t\tif ( this.sheenRoughness !== undefined ) data.sheenRoughness = this.sheenRoughness;\n\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\tif ( this.emissiveIntensity && 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.specularIntensity !== undefined ) data.specularIntensity = this.specularIntensity;\n\t\tif ( this.specularColor && this.specularColor.isColor ) data.specularColor = this.specularColor.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.clearcoatMap && this.clearcoatMap.isTexture ) {\n\n\t\t\tdata.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) {\n\n\t\t\tdata.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) {\n\n\t\t\tdata.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid;\n\t\t\tdata.clearcoatNormalScale = this.clearcoatNormalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.iridescence !== undefined ) data.iridescence = this.iridescence;\n\t\tif ( this.iridescenceIOR !== undefined ) data.iridescenceIOR = this.iridescenceIOR;\n\t\tif ( this.iridescenceThicknessRange !== undefined ) data.iridescenceThicknessRange = this.iridescenceThicknessRange;\n\n\t\tif ( this.iridescenceMap && this.iridescenceMap.isTexture ) {\n\n\t\t\tdata.iridescenceMap = this.iridescenceMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.iridescenceThicknessMap && this.iridescenceThicknessMap.isTexture ) {\n\n\t\t\tdata.iridescenceThicknessMap = this.iridescenceThicknessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.anisotropy !== undefined ) data.anisotropy = this.anisotropy;\n\t\tif ( this.anisotropyRotation !== undefined ) data.anisotropyRotation = this.anisotropyRotation;\n\n\t\tif ( this.anisotropyMap && this.anisotropyMap.isTexture ) {\n\n\t\t\tdata.anisotropyMap = this.anisotropyMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\tif ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid;\n\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\n\t\tif ( this.lightMap && this.lightMap.isTexture ) {\n\n\t\t\tdata.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tdata.lightMapIntensity = this.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( this.aoMap && this.aoMap.isTexture ) {\n\n\t\t\tdata.aoMap = this.aoMap.toJSON( meta ).uuid;\n\t\t\tdata.aoMapIntensity = this.aoMapIntensity;\n\n\t\t}\n\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\n\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\tdata.normalMapType = this.normalMapType;\n\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t}\n\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\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\t\tif ( this.specularIntensityMap && this.specularIntensityMap.isTexture ) data.specularIntensityMap = this.specularIntensityMap.toJSON( meta ).uuid;\n\t\tif ( this.specularColorMap && this.specularColorMap.isTexture ) data.specularColorMap = this.specularColorMap.toJSON( meta ).uuid;\n\n\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.combine !== undefined ) data.combine = this.combine;\n\n\t\t}\n\n\t\tif ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity;\n\t\tif ( this.reflectivity !== undefined ) data.reflectivity = this.reflectivity;\n\t\tif ( this.refractionRatio !== undefined ) data.refractionRatio = this.refractionRatio;\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.transmission !== undefined ) data.transmission = this.transmission;\n\t\tif ( this.transmissionMap && this.transmissionMap.isTexture ) data.transmissionMap = this.transmissionMap.toJSON( meta ).uuid;\n\t\tif ( this.thickness !== undefined ) data.thickness = this.thickness;\n\t\tif ( this.thicknessMap && this.thicknessMap.isTexture ) data.thicknessMap = this.thicknessMap.toJSON( meta ).uuid;\n\t\tif ( this.attenuationDistance !== undefined && this.attenuationDistance !== Infinity ) data.attenuationDistance = this.attenuationDistance;\n\t\tif ( this.attenuationColor !== undefined ) data.attenuationColor = this.attenuationColor.getHex();\n\n\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\tif ( this.shadowSide !== null ) data.shadowSide = this.shadowSide;\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.side !== FrontSide ) data.side = this.side;\n\t\tif ( this.vertexColors === true ) data.vertexColors = true;\n\n\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\tif ( this.transparent === true ) data.transparent = true;\n\n\t\tif ( this.blendSrc !== SrcAlphaFactor ) data.blendSrc = this.blendSrc;\n\t\tif ( this.blendDst !== OneMinusSrcAlphaFactor ) data.blendDst = this.blendDst;\n\t\tif ( this.blendEquation !== AddEquation ) data.blendEquation = this.blendEquation;\n\t\tif ( this.blendSrcAlpha !== null ) data.blendSrcAlpha = this.blendSrcAlpha;\n\t\tif ( this.blendDstAlpha !== null ) data.blendDstAlpha = this.blendDstAlpha;\n\t\tif ( this.blendEquationAlpha !== null ) data.blendEquationAlpha = this.blendEquationAlpha;\n\t\tif ( this.blendColor && this.blendColor.isColor ) data.blendColor = this.blendColor.getHex();\n\t\tif ( this.blendAlpha !== 0 ) data.blendAlpha = this.blendAlpha;\n\n\t\tif ( this.depthFunc !== LessEqualDepth ) data.depthFunc = this.depthFunc;\n\t\tif ( this.depthTest === false ) data.depthTest = this.depthTest;\n\t\tif ( this.depthWrite === false ) data.depthWrite = this.depthWrite;\n\t\tif ( this.colorWrite === false ) data.colorWrite = this.colorWrite;\n\n\t\tif ( this.stencilWriteMask !== 0xff ) data.stencilWriteMask = this.stencilWriteMask;\n\t\tif ( this.stencilFunc !== AlwaysStencilFunc ) data.stencilFunc = this.stencilFunc;\n\t\tif ( this.stencilRef !== 0 ) data.stencilRef = this.stencilRef;\n\t\tif ( this.stencilFuncMask !== 0xff ) data.stencilFuncMask = this.stencilFuncMask;\n\t\tif ( this.stencilFail !== KeepStencilOp ) data.stencilFail = this.stencilFail;\n\t\tif ( this.stencilZFail !== KeepStencilOp ) data.stencilZFail = this.stencilZFail;\n\t\tif ( this.stencilZPass !== KeepStencilOp ) data.stencilZPass = this.stencilZPass;\n\t\tif ( this.stencilWrite === true ) data.stencilWrite = this.stencilWrite;\n\n\t\t// rotation (SpriteMaterial)\n\t\tif ( this.rotation !== undefined && this.rotation !== 0 ) data.rotation = this.rotation;\n\n\t\tif ( this.polygonOffset === true ) data.polygonOffset = true;\n\t\tif ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor;\n\t\tif ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits;\n\n\t\tif ( this.linewidth !== undefined && 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.alphaHash === true ) data.alphaHash = true;\n\t\tif ( this.alphaToCoverage === true ) data.alphaToCoverage = true;\n\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = true;\n\t\tif ( this.forceSinglePass === true ) data.forceSinglePass = true;\n\n\t\tif ( this.wireframe === true ) data.wireframe = true;\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.flatShading === true ) data.flatShading = true;\n\n\t\tif ( this.visible === false ) data.visible = false;\n\n\t\tif ( this.toneMapped === false ) data.toneMapped = false;\n\n\t\tif ( this.fog === false ) data.fog = false;\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst 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 ( isRootObject ) {\n\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst 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() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.blending = source.blending;\n\t\tthis.side = source.side;\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\t\tthis.blendColor.copy( source.blendColor );\n\t\tthis.blendAlpha = source.blendAlpha;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\n\t\tthis.stencilWriteMask = source.stencilWriteMask;\n\t\tthis.stencilFunc = source.stencilFunc;\n\t\tthis.stencilRef = source.stencilRef;\n\t\tthis.stencilFuncMask = source.stencilFuncMask;\n\t\tthis.stencilFail = source.stencilFail;\n\t\tthis.stencilZFail = source.stencilZFail;\n\t\tthis.stencilZPass = source.stencilZPass;\n\t\tthis.stencilWrite = source.stencilWrite;\n\n\t\tconst srcPlanes = source.clippingPlanes;\n\t\tlet dstPlanes = null;\n\n\t\tif ( srcPlanes !== null ) {\n\n\t\t\tconst n = srcPlanes.length;\n\t\t\tdstPlanes = new Array( n );\n\n\t\t\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.clippingPlanes = dstPlanes;\n\t\tthis.clipIntersection = source.clipIntersection;\n\t\tthis.clipShadows = source.clipShadows;\n\n\t\tthis.shadowSide = source.shadowSide;\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.alphaHash = source.alphaHash;\n\t\tthis.alphaToCoverage = source.alphaToCoverage;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\t\tthis.forceSinglePass = source.forceSinglePass;\n\n\t\tthis.visible = source.visible;\n\n\t\tthis.toneMapped = source.toneMapped;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n}\n\nclass MeshBasicMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshBasicMaterial = true;\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // emissive\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n\nconst _tables = /*@__PURE__*/ _generateTables();\n\nfunction _generateTables() {\n\n\t// float32 to float16 helpers\n\n\tconst buffer = new ArrayBuffer( 4 );\n\tconst floatView = new Float32Array( buffer );\n\tconst uint32View = new Uint32Array( buffer );\n\n\tconst baseTable = new Uint32Array( 512 );\n\tconst shiftTable = new Uint32Array( 512 );\n\n\tfor ( let i = 0; i < 256; ++ i ) {\n\n\t\tconst e = i - 127;\n\n\t\t// very small number (0, -0)\n\n\t\tif ( e < - 27 ) {\n\n\t\t\tbaseTable[ i ] = 0x0000;\n\t\t\tbaseTable[ i | 0x100 ] = 0x8000;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// small number (denorm)\n\n\t\t} else if ( e < - 14 ) {\n\n\t\t\tbaseTable[ i ] = 0x0400 >> ( - e - 14 );\n\t\t\tbaseTable[ i | 0x100 ] = ( 0x0400 >> ( - e - 14 ) ) | 0x8000;\n\t\t\tshiftTable[ i ] = - e - 1;\n\t\t\tshiftTable[ i | 0x100 ] = - e - 1;\n\n\t\t\t// normal number\n\n\t\t} else if ( e <= 15 ) {\n\n\t\t\tbaseTable[ i ] = ( e + 15 ) << 10;\n\t\t\tbaseTable[ i | 0x100 ] = ( ( e + 15 ) << 10 ) | 0x8000;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t\t// large number (Infinity, -Infinity)\n\n\t\t} else if ( e < 128 ) {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// stay (NaN, Infinity, -Infinity)\n\n\t\t} else {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t}\n\n\t}\n\n\t// float16 to float32 helpers\n\n\tconst mantissaTable = new Uint32Array( 2048 );\n\tconst exponentTable = new Uint32Array( 64 );\n\tconst offsetTable = new Uint32Array( 64 );\n\n\tfor ( let i = 1; i < 1024; ++ i ) {\n\n\t\tlet m = i << 13; // zero pad mantissa bits\n\t\tlet e = 0; // zero exponent\n\n\t\t// normalized\n\t\twhile ( ( m & 0x00800000 ) === 0 ) {\n\n\t\t\tm <<= 1;\n\t\t\te -= 0x00800000; // decrement exponent\n\n\t\t}\n\n\t\tm &= ~ 0x00800000; // clear leading 1 bit\n\t\te += 0x38800000; // adjust bias\n\n\t\tmantissaTable[ i ] = m | e;\n\n\t}\n\n\tfor ( let i = 1024; i < 2048; ++ i ) {\n\n\t\tmantissaTable[ i ] = 0x38000000 + ( ( i - 1024 ) << 13 );\n\n\t}\n\n\tfor ( let i = 1; i < 31; ++ i ) {\n\n\t\texponentTable[ i ] = i << 23;\n\n\t}\n\n\texponentTable[ 31 ] = 0x47800000;\n\texponentTable[ 32 ] = 0x80000000;\n\n\tfor ( let i = 33; i < 63; ++ i ) {\n\n\t\texponentTable[ i ] = 0x80000000 + ( ( i - 32 ) << 23 );\n\n\t}\n\n\texponentTable[ 63 ] = 0xc7800000;\n\n\tfor ( let i = 1; i < 64; ++ i ) {\n\n\t\tif ( i !== 32 ) {\n\n\t\t\toffsetTable[ i ] = 1024;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tfloatView: floatView,\n\t\tuint32View: uint32View,\n\t\tbaseTable: baseTable,\n\t\tshiftTable: shiftTable,\n\t\tmantissaTable: mantissaTable,\n\t\texponentTable: exponentTable,\n\t\toffsetTable: offsetTable\n\t};\n\n}\n\n// float32 to float16\n\nfunction toHalfFloat( val ) {\n\n\tif ( Math.abs( val ) > 65504 ) console.warn( 'THREE.DataUtils.toHalfFloat(): Value out of range.' );\n\n\tval = clamp( val, - 65504, 65504 );\n\n\t_tables.floatView[ 0 ] = val;\n\tconst f = _tables.uint32View[ 0 ];\n\tconst e = ( f >> 23 ) & 0x1ff;\n\treturn _tables.baseTable[ e ] + ( ( f & 0x007fffff ) >> _tables.shiftTable[ e ] );\n\n}\n\n// float16 to float32\n\nfunction fromHalfFloat( val ) {\n\n\tconst m = val >> 10;\n\t_tables.uint32View[ 0 ] = _tables.mantissaTable[ _tables.offsetTable[ m ] + ( val & 0x3ff ) ] + _tables.exponentTable[ m ];\n\treturn _tables.floatView[ 0 ];\n\n}\n\nconst DataUtils = {\n\ttoHalfFloat: toHalfFloat,\n\tfromHalfFloat: fromHalfFloat,\n};\n\nconst _vector$8 = /*@__PURE__*/ new Vector3();\nconst _vector2$1 = /*@__PURE__*/ new Vector2();\n\nclass BufferAttribute {\n\n\tconstructor( array, itemSize, normalized = false ) {\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.isBufferAttribute = true;\n\n\t\tthis.name = '';\n\n\t\tthis.array = array;\n\t\tthis.itemSize = itemSize;\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\t\tthis.normalized = normalized;\n\n\t\tthis.usage = StaticDrawUsage;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\t\tthis.gpuType = FloatType;\n\n\t\tthis.version = 0;\n\n\t}\n\n\tonUploadCallback() {}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\tcopy( 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.usage = source.usage;\n\t\tthis.gpuType = source.gpuType;\n\n\t\treturn this;\n\n\t}\n\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.itemSize;\n\t\tindex2 *= attribute.itemSize;\n\n\t\tfor ( let 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( array ) {\n\n\t\tthis.array.set( array );\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tif ( this.itemSize === 2 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector2$1.fromBufferAttribute( this, i );\n\t\t\t\t_vector2$1.applyMatrix3( m );\n\n\t\t\t\tthis.setXY( i, _vector2$1.x, _vector2$1.y );\n\n\t\t\t}\n\n\t\t} else if ( this.itemSize === 3 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector$8.fromBufferAttribute( this, i );\n\t\t\t\t_vector$8.applyMatrix3( m );\n\n\t\t\t\tthis.setXYZ( i, _vector$8.x, _vector$8.y, _vector$8.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$8.fromBufferAttribute( this, i );\n\n\t\t\t_vector$8.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$8.x, _vector$8.y, _vector$8.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$8.fromBufferAttribute( this, i );\n\n\t\t\t_vector$8.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$8.x, _vector$8.y, _vector$8.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$8.fromBufferAttribute( this, i );\n\n\t\t\t_vector$8.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$8.x, _vector$8.y, _vector$8.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tset( value, offset = 0 ) {\n\n\t\t// Matching BufferAttribute constructor, do not normalize the array.\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index, component ) {\n\n\t\tlet value = this.array[ index * this.itemSize + component ];\n\n\t\tif ( this.normalized ) value = denormalize( value, this.array );\n\n\t\treturn value;\n\n\t}\n\n\tsetComponent( index, component, value ) {\n\n\t\tif ( this.normalized ) value = normalize( value, this.array );\n\n\t\tthis.array[ index * this.itemSize + component ] = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetX( index ) {\n\n\t\tlet x = this.array[ index * this.itemSize ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\treturn this;\n\n\t}\n\n\tgetY( index ) {\n\n\t\tlet y = this.array[ index * this.itemSize + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\tlet z = this.array[ index * this.itemSize + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tgetW( index ) {\n\n\t\tlet w = this.array[ index * this.itemSize + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\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( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\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( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\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( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\titemSize: this.itemSize,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tarray: Array.from( this.array ),\n\t\t\tnormalized: this.normalized\n\t\t};\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( this.usage !== StaticDrawUsage ) data.usage = this.usage;\n\t\tif ( this.updateRange.offset !== 0 || this.updateRange.count !== - 1 ) data.updateRange = this.updateRange;\n\n\t\treturn data;\n\n\t}\n\n}\n\n//\n\nclass Int8BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint8BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint8ClampedBufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8ClampedArray( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Int16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Int32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Float16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t\tthis.isFloat16BufferAttribute = true;\n\n\t}\n\n\tgetX( index ) {\n\n\t\tlet x = fromHalfFloat( this.array[ index * this.itemSize ] );\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = toHalfFloat( x );\n\n\t\treturn this;\n\n\t}\n\n\tgetY( index ) {\n\n\t\tlet y = fromHalfFloat( this.array[ index * this.itemSize + 1 ] );\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\tlet z = fromHalfFloat( this.array[ index * this.itemSize + 2 ] );\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tgetW( index ) {\n\n\t\tlet w = fromHalfFloat( this.array[ index * this.itemSize + 3 ] );\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\t\tthis.array[ index + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n}\n\n\nclass Float32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Float64BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float64Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nlet _id$2 = 0;\n\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _obj = /*@__PURE__*/ new Object3D();\nconst _offset = /*@__PURE__*/ new Vector3();\nconst _box$1 = /*@__PURE__*/ new Box3();\nconst _boxMorphTargets = /*@__PURE__*/ new Box3();\nconst _vector$7 = /*@__PURE__*/ new Vector3();\n\nclass BufferGeometry extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isBufferGeometry = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _id$2 ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\n\t\tthis.morphAttributes = {};\n\t\tthis.morphTargetsRelative = false;\n\n\t\tthis.groups = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t\tthis.userData = {};\n\n\t}\n\n\tgetIndex() {\n\n\t\treturn this.index;\n\n\t}\n\n\tsetIndex( index ) {\n\n\t\tif ( Array.isArray( index ) ) {\n\n\t\t\tthis.index = new ( arrayNeedsUint32( index ) ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t} else {\n\n\t\t\tthis.index = index;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetAttribute( name ) {\n\n\t\treturn this.attributes[ name ];\n\n\t}\n\n\tsetAttribute( name, attribute ) {\n\n\t\tthis.attributes[ name ] = attribute;\n\n\t\treturn this;\n\n\t}\n\n\tdeleteAttribute( name ) {\n\n\t\tdelete this.attributes[ name ];\n\n\t\treturn this;\n\n\t}\n\n\thasAttribute( name ) {\n\n\t\treturn this.attributes[ name ] !== undefined;\n\n\t}\n\n\taddGroup( start, count, materialIndex = 0 ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t}\n\n\tclearGroups() {\n\n\t\tthis.groups = [];\n\n\t}\n\n\tsetDrawRange( start, count ) {\n\n\t\tthis.drawRange.start = start;\n\t\tthis.drawRange.count = count;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tconst position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tposition.applyMatrix4( matrix );\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t}\n\n\t\tconst normal = this.attributes.normal;\n\n\t\tif ( normal !== undefined ) {\n\n\t\t\tconst normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tnormal.applyNormalMatrix( normalMatrix );\n\n\t\t\tnormal.needsUpdate = true;\n\n\t\t}\n\n\t\tconst tangent = this.attributes.tangent;\n\n\t\tif ( tangent !== undefined ) {\n\n\t\t\ttangent.transformDirection( matrix );\n\n\t\t\ttangent.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\tapplyQuaternion( q ) {\n\n\t\t_m1.makeRotationFromQuaternion( q );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateX( angle ) {\n\n\t\t// rotate geometry around world x-axis\n\n\t\t_m1.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateY( angle ) {\n\n\t\t// rotate geometry around world y-axis\n\n\t\t_m1.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateZ( angle ) {\n\n\t\t// rotate geometry around world z-axis\n\n\t\t_m1.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( x, y, z ) {\n\n\t\t// translate geometry\n\n\t\t_m1.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\tscale( x, y, z ) {\n\n\t\t// scale geometry\n\n\t\t_m1.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\tlookAt( vector ) {\n\n\t\t_obj.lookAt( vector );\n\n\t\t_obj.updateMatrix();\n\n\t\tthis.applyMatrix4( _obj.matrix );\n\n\t\treturn this;\n\n\t}\n\n\tcenter() {\n\n\t\tthis.computeBoundingBox();\n\n\t\tthis.boundingBox.getCenter( _offset ).negate();\n\n\t\tthis.translate( _offset.x, _offset.y, _offset.z );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tconst position = [];\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tconst point = points[ i ];\n\t\t\tposition.push( point.x, point.y, point.z || 0 );\n\n\t\t}\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\n\t\treturn this;\n\n\t}\n\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box. Alternatively set \"mesh.frustumCulled\" to \"false\".', this );\n\n\t\t\tthis.boundingBox.set(\n\t\t\t\tnew Vector3( - Infinity, - Infinity, - Infinity ),\n\t\t\t\tnew Vector3( + Infinity, + Infinity, + Infinity )\n\t\t\t);\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_box$1.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$7.addVectors( this.boundingBox.min, _box$1.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$7 );\n\n\t\t\t\t\t\t_vector$7.addVectors( this.boundingBox.max, _box$1.max );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$7 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$1.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$1.max );\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\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() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere. Alternatively set \"mesh.frustumCulled\" to \"false\".', this );\n\n\t\t\tthis.boundingSphere.set( new Vector3(), Infinity );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position ) {\n\n\t\t\t// first, find the center of the bounding sphere\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\t_box$1.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_boxMorphTargets.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$7.addVectors( _box$1.min, _boxMorphTargets.min );\n\t\t\t\t\t\t_box$1.expandByPoint( _vector$7 );\n\n\t\t\t\t\t\t_vector$7.addVectors( _box$1.max, _boxMorphTargets.max );\n\t\t\t\t\t\t_box$1.expandByPoint( _vector$7 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_box$1.expandByPoint( _boxMorphTargets.min );\n\t\t\t\t\t\t_box$1.expandByPoint( _boxMorphTargets.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_box$1.getCenter( center );\n\n\t\t\t// second, try to find a boundingSphere with a radius smaller than the\n\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t_vector$7.fromBufferAttribute( position, i );\n\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$7 ) );\n\n\t\t\t}\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\tconst morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t\t\t\tfor ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t_vector$7.fromBufferAttribute( morphAttribute, j );\n\n\t\t\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t\t\t_offset.fromBufferAttribute( position, j );\n\t\t\t\t\t\t\t_vector$7.add( _offset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$7 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\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}\n\n\t\t}\n\n\t}\n\n\tcomputeTangents() {\n\n\t\tconst index = this.index;\n\t\tconst attributes = this.attributes;\n\n\t\t// based on http://www.terathon.com/code/tangent.html\n\t\t// (per vertex tangents)\n\n\t\tif ( index === null ||\n\t\t\t attributes.position === undefined ||\n\t\t\t attributes.normal === undefined ||\n\t\t\t attributes.uv === undefined ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst indices = index.array;\n\t\tconst positions = attributes.position.array;\n\t\tconst normals = attributes.normal.array;\n\t\tconst uvs = attributes.uv.array;\n\n\t\tconst nVertices = positions.length / 3;\n\n\t\tif ( this.hasAttribute( 'tangent' ) === false ) {\n\n\t\t\tthis.setAttribute( 'tangent', new BufferAttribute( new Float32Array( 4 * nVertices ), 4 ) );\n\n\t\t}\n\n\t\tconst tangents = this.getAttribute( 'tangent' ).array;\n\n\t\tconst tan1 = [], tan2 = [];\n\n\t\tfor ( let i = 0; i < nVertices; i ++ ) {\n\n\t\t\ttan1[ i ] = new Vector3();\n\t\t\ttan2[ i ] = new Vector3();\n\n\t\t}\n\n\t\tconst vA = new Vector3(),\n\t\t\tvB = new Vector3(),\n\t\t\tvC = new Vector3(),\n\n\t\t\tuvA = new Vector2(),\n\t\t\tuvB = new Vector2(),\n\t\t\tuvC = new Vector2(),\n\n\t\t\tsdir = new Vector3(),\n\t\t\ttdir = new Vector3();\n\n\t\tfunction handleTriangle( a, b, c ) {\n\n\t\t\tvA.fromArray( positions, a * 3 );\n\t\t\tvB.fromArray( positions, b * 3 );\n\t\t\tvC.fromArray( positions, c * 3 );\n\n\t\t\tuvA.fromArray( uvs, a * 2 );\n\t\t\tuvB.fromArray( uvs, b * 2 );\n\t\t\tuvC.fromArray( uvs, c * 2 );\n\n\t\t\tvB.sub( vA );\n\t\t\tvC.sub( vA );\n\n\t\t\tuvB.sub( uvA );\n\t\t\tuvC.sub( uvA );\n\n\t\t\tconst r = 1.0 / ( uvB.x * uvC.y - uvC.x * uvB.y );\n\n\t\t\t// silently ignore degenerate uv triangles having coincident or colinear vertices\n\n\t\t\tif ( ! isFinite( r ) ) return;\n\n\t\t\tsdir.copy( vB ).multiplyScalar( uvC.y ).addScaledVector( vC, - uvB.y ).multiplyScalar( r );\n\t\t\ttdir.copy( vC ).multiplyScalar( uvB.x ).addScaledVector( vB, - uvC.x ).multiplyScalar( r );\n\n\t\t\ttan1[ a ].add( sdir );\n\t\t\ttan1[ b ].add( sdir );\n\t\t\ttan1[ c ].add( sdir );\n\n\t\t\ttan2[ a ].add( tdir );\n\t\t\ttan2[ b ].add( tdir );\n\t\t\ttan2[ c ].add( tdir );\n\n\t\t}\n\n\t\tlet groups = this.groups;\n\n\t\tif ( groups.length === 0 ) {\n\n\t\t\tgroups = [ {\n\t\t\t\tstart: 0,\n\t\t\t\tcount: indices.length\n\t\t\t} ];\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleTriangle(\n\t\t\t\t\tindices[ j + 0 ],\n\t\t\t\t\tindices[ j + 1 ],\n\t\t\t\t\tindices[ j + 2 ]\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst tmp = new Vector3(), tmp2 = new Vector3();\n\t\tconst n = new Vector3(), n2 = new Vector3();\n\n\t\tfunction handleVertex( v ) {\n\n\t\t\tn.fromArray( normals, v * 3 );\n\t\t\tn2.copy( n );\n\n\t\t\tconst t = tan1[ v ];\n\n\t\t\t// Gram-Schmidt orthogonalize\n\n\t\t\ttmp.copy( t );\n\t\t\ttmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize();\n\n\t\t\t// Calculate handedness\n\n\t\t\ttmp2.crossVectors( n2, t );\n\t\t\tconst test = tmp2.dot( tan2[ v ] );\n\t\t\tconst w = ( test < 0.0 ) ? - 1.0 : 1.0;\n\n\t\t\ttangents[ v * 4 ] = tmp.x;\n\t\t\ttangents[ v * 4 + 1 ] = tmp.y;\n\t\t\ttangents[ v * 4 + 2 ] = tmp.z;\n\t\t\ttangents[ v * 4 + 3 ] = w;\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleVertex( indices[ j + 0 ] );\n\t\t\t\thandleVertex( indices[ j + 1 ] );\n\t\t\t\thandleVertex( indices[ j + 2 ] );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcomputeVertexNormals() {\n\n\t\tconst index = this.index;\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute !== undefined ) {\n\n\t\t\tlet normalAttribute = this.getAttribute( 'normal' );\n\n\t\t\tif ( normalAttribute === undefined ) {\n\n\t\t\t\tnormalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 );\n\t\t\t\tthis.setAttribute( 'normal', normalAttribute );\n\n\t\t\t} else {\n\n\t\t\t\t// reset existing normals to zero\n\n\t\t\t\tfor ( let i = 0, il = normalAttribute.count; i < il; i ++ ) {\n\n\t\t\t\t\tnormalAttribute.setXYZ( i, 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\tconst nA = new Vector3(), nB = new Vector3(), nC = new Vector3();\n\t\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\t\t// indexed elements\n\n\t\t\tif ( index ) {\n\n\t\t\t\tfor ( let i = 0, il = index.count; i < il; i += 3 ) {\n\n\t\t\t\t\tconst vA = index.getX( i + 0 );\n\t\t\t\t\tconst vB = index.getX( i + 1 );\n\t\t\t\t\tconst vC = index.getX( i + 2 );\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, vA );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, vB );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, vC );\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\tnA.fromBufferAttribute( normalAttribute, vA );\n\t\t\t\t\tnB.fromBufferAttribute( normalAttribute, vB );\n\t\t\t\t\tnC.fromBufferAttribute( normalAttribute, vC );\n\n\t\t\t\t\tnA.add( cb );\n\t\t\t\t\tnB.add( cb );\n\t\t\t\t\tnC.add( cb );\n\n\t\t\t\t\tnormalAttribute.setXYZ( vA, nA.x, nA.y, nA.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vB, nB.x, nB.y, nB.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vC, nC.x, nC.y, nC.z );\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 ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) {\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, i + 0 );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, i + 1 );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, i + 2 );\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\tnormalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.normalizeNormals();\n\n\t\t\tnormalAttribute.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tnormalizeNormals() {\n\n\t\tconst normals = this.attributes.normal;\n\n\t\tfor ( let i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( normals, i );\n\n\t\t\t_vector$7.normalize();\n\n\t\t\tnormals.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t}\n\n\ttoNonIndexed() {\n\n\t\tfunction convertBufferAttribute( attribute, indices ) {\n\n\t\t\tconst array = attribute.array;\n\t\t\tconst itemSize = attribute.itemSize;\n\t\t\tconst normalized = attribute.normalized;\n\n\t\t\tconst array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tlet index = 0, index2 = 0;\n\n\t\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\tindex = indices[ i ] * attribute.data.stride + attribute.offset;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let 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\treturn new BufferAttribute( array2, itemSize, normalized );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.index === null ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst geometry2 = new BufferGeometry();\n\n\t\tconst indices = this.index.array;\n\t\tconst attributes = this.attributes;\n\n\t\t// attributes\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\n\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\tgeometry2.setAttribute( name, newAttribute );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = this.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst morphArray = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = morphAttribute[ i ];\n\n\t\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\t\tmorphArray.push( newAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry2.morphAttributes[ name ] = morphArray;\n\n\t\t}\n\n\t\tgeometry2.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = this.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst 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() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.6,\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\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tconst parameters = this.parameters;\n\n\t\t\tfor ( const 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\t// for simplicity the code assumes attributes are not shared across geometries, see #15811\n\n\t\tdata.data = { attributes: {} };\n\n\t\tconst index = this.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdata.data.index = {\n\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\tarray: Array.prototype.slice.call( index.array )\n\t\t\t};\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tdata.data.attributes[ key ] = attribute.toJSON( data.data );\n\n\t\t}\n\n\t\tconst morphAttributes = {};\n\t\tlet hasMorphAttributes = false;\n\n\t\tfor ( const key in this.morphAttributes ) {\n\n\t\t\tconst attributeArray = this.morphAttributes[ key ];\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = attributeArray[ i ];\n\n\t\t\t\tarray.push( attribute.toJSON( data.data ) );\n\n\t\t\t}\n\n\t\t\tif ( array.length > 0 ) {\n\n\t\t\t\tmorphAttributes[ key ] = array;\n\n\t\t\t\thasMorphAttributes = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hasMorphAttributes ) {\n\n\t\t\tdata.data.morphAttributes = morphAttributes;\n\t\t\tdata.data.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t}\n\n\t\tconst 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\tconst 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() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\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// used for storing cloned, shared data\n\n\t\tconst data = {};\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// index\n\n\t\tconst index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone( data ) );\n\n\t\t}\n\n\t\t// attributes\n\n\t\tconst attributes = source.attributes;\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\t\t\tthis.setAttribute( name, attribute.clone( data ) );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = source.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\tarray.push( morphAttribute[ i ].clone( data ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\tthis.morphTargetsRelative = source.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = source.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst 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\tconst 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\tconst 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\t// user data\n\n\t\tthis.userData = source.userData;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nconst _inverseMatrix$3 = /*@__PURE__*/ new Matrix4();\nconst _ray$3 = /*@__PURE__*/ new Ray();\nconst _sphere$5 = /*@__PURE__*/ new Sphere();\nconst _sphereHitAt = /*@__PURE__*/ new Vector3();\n\nconst _vA$1 = /*@__PURE__*/ new Vector3();\nconst _vB$1 = /*@__PURE__*/ new Vector3();\nconst _vC$1 = /*@__PURE__*/ new Vector3();\n\nconst _tempA = /*@__PURE__*/ new Vector3();\nconst _morphA = /*@__PURE__*/ new Vector3();\n\nconst _uvA$1 = /*@__PURE__*/ new Vector2();\nconst _uvB$1 = /*@__PURE__*/ new Vector2();\nconst _uvC$1 = /*@__PURE__*/ new Vector2();\n\nconst _normalA = /*@__PURE__*/ new Vector3();\nconst _normalB = /*@__PURE__*/ new Vector3();\nconst _normalC = /*@__PURE__*/ new Vector3();\n\nconst _intersectionPoint = /*@__PURE__*/ new Vector3();\nconst _intersectionPointWorld = /*@__PURE__*/ new Vector3();\n\nclass Mesh extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new MeshBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.isMesh = true;\n\n\t\tthis.type = 'Mesh';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\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\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ 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\tgetVertexPosition( index, target ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.attributes.position;\n\t\tconst morphPosition = geometry.morphAttributes.position;\n\t\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\n\t\ttarget.fromBufferAttribute( position, index );\n\n\t\tconst morphInfluences = this.morphTargetInfluences;\n\n\t\tif ( morphPosition && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morphAttribute = morphPosition[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morphAttribute, index );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( target ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttarget.add( _morphA );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// test with bounding sphere in world space\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$5.copy( geometry.boundingSphere );\n\t\t_sphere$5.applyMatrix4( matrixWorld );\n\n\t\t// check distance from ray origin to bounding sphere\n\n\t\t_ray$3.copy( raycaster.ray ).recast( raycaster.near );\n\n\t\tif ( _sphere$5.containsPoint( _ray$3.origin ) === false ) {\n\n\t\t\tif ( _ray$3.intersectSphere( _sphere$5, _sphereHitAt ) === null ) return;\n\n\t\t\tif ( _ray$3.origin.distanceToSquared( _sphereHitAt ) > ( raycaster.far - raycaster.near ) ** 2 ) return;\n\n\t\t}\n\n\t\t// convert ray to local space of mesh\n\n\t\t_inverseMatrix$3.copy( matrixWorld ).invert();\n\t\t_ray$3.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$3 );\n\n\t\t// test with bounding box in local space\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tif ( _ray$3.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\t// test for intersections with geometry\n\n\t\tthis._computeIntersections( raycaster, intersects, _ray$3 );\n\n\t}\n\n\t_computeIntersections( raycaster, intersects, rayLocalSpace ) {\n\n\t\tlet intersection;\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\n\t\tconst index = geometry.index;\n\t\tconst position = geometry.attributes.position;\n\t\tconst uv = geometry.attributes.uv;\n\t\tconst uv1 = geometry.attributes.uv1;\n\t\tconst normal = geometry.attributes.normal;\n\t\tconst groups = geometry.groups;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\tif ( index !== null ) {\n\n\t\t\t// indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( index.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = index.getX( j );\n\t\t\t\t\t\tconst b = index.getX( j + 1 );\n\t\t\t\t\t\tconst c = index.getX( j + 2 );\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\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}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = index.getX( i );\n\t\t\t\t\tconst b = index.getX( i + 1 );\n\t\t\t\t\tconst c = index.getX( i + 2 );\n\n\t\t\t\t\tintersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics\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} else if ( position !== undefined ) {\n\n\t\t\t// non-indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( position.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = j;\n\t\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\t\tconst c = j + 2;\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\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}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( position.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = i;\n\t\t\t\t\tconst b = i + 1;\n\t\t\t\t\tconst c = i + 2;\n\n\t\t\t\t\tintersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics\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}\n\nfunction checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) {\n\n\tlet intersect;\n\n\tif ( material.side === BackSide ) {\n\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t} else {\n\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, ( material.side === FrontSide ), point );\n\n\t}\n\n\tif ( intersect === null ) return null;\n\n\t_intersectionPointWorld.copy( point );\n\t_intersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\treturn {\n\t\tdistance: distance,\n\t\tpoint: _intersectionPointWorld.clone(),\n\t\tobject: object\n\t};\n\n}\n\nfunction checkGeometryIntersection( object, material, raycaster, ray, uv, uv1, normal, a, b, c ) {\n\n\tobject.getVertexPosition( a, _vA$1 );\n\tobject.getVertexPosition( b, _vB$1 );\n\tobject.getVertexPosition( c, _vC$1 );\n\n\tconst intersection = checkIntersection( object, material, raycaster, ray, _vA$1, _vB$1, _vC$1, _intersectionPoint );\n\n\tif ( intersection ) {\n\n\t\tif ( uv ) {\n\n\t\t\t_uvA$1.fromBufferAttribute( uv, a );\n\t\t\t_uvB$1.fromBufferAttribute( uv, b );\n\t\t\t_uvC$1.fromBufferAttribute( uv, c );\n\n\t\t\tintersection.uv = Triangle.getInterpolation( _intersectionPoint, _vA$1, _vB$1, _vC$1, _uvA$1, _uvB$1, _uvC$1, new Vector2() );\n\n\t\t}\n\n\t\tif ( uv1 ) {\n\n\t\t\t_uvA$1.fromBufferAttribute( uv1, a );\n\t\t\t_uvB$1.fromBufferAttribute( uv1, b );\n\t\t\t_uvC$1.fromBufferAttribute( uv1, c );\n\n\t\t\tintersection.uv1 = Triangle.getInterpolation( _intersectionPoint, _vA$1, _vB$1, _vC$1, _uvA$1, _uvB$1, _uvC$1, new Vector2() );\n\t\t\tintersection.uv2 = intersection.uv1; // @deprecated, r152\n\n\t\t}\n\n\t\tif ( normal ) {\n\n\t\t\t_normalA.fromBufferAttribute( normal, a );\n\t\t\t_normalB.fromBufferAttribute( normal, b );\n\t\t\t_normalC.fromBufferAttribute( normal, c );\n\n\t\t\tintersection.normal = Triangle.getInterpolation( _intersectionPoint, _vA$1, _vB$1, _vC$1, _normalA, _normalB, _normalC, new Vector3() );\n\n\t\t\tif ( intersection.normal.dot( ray.direction ) > 0 ) {\n\n\t\t\t\tintersection.normal.multiplyScalar( - 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst face = {\n\t\t\ta: a,\n\t\t\tb: b,\n\t\t\tc: c,\n\t\t\tnormal: new Vector3(),\n\t\t\tmaterialIndex: 0\n\t\t};\n\n\t\tTriangle.getNormal( _vA$1, _vB$1, _vC$1, face.normal );\n\n\t\tintersection.face = face;\n\n\t}\n\n\treturn intersection;\n\n}\n\nclass BoxGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tconst scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\t\tdepthSegments = Math.floor( depthSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet numberOfVertices = 0;\n\t\tlet groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tconst segmentWidth = width / gridX;\n\t\t\tconst segmentHeight = height / gridY;\n\n\t\t\tconst widthHalf = width / 2;\n\t\t\tconst heightHalf = height / 2;\n\t\t\tconst depthHalf = depth / 2;\n\n\t\t\tconst gridX1 = gridX + 1;\n\t\t\tconst gridY1 = gridY + 1;\n\n\t\t\tlet vertexCounter = 0;\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tconst y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tconst x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : - 1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tconst a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tconst b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments );\n\n\t}\n\n}\n\n/**\n * Uniform Utilities\n */\n\nfunction cloneUniforms( src ) {\n\n\tconst dst = {};\n\n\tfor ( const u in src ) {\n\n\t\tdst[ u ] = {};\n\n\t\tfor ( const p in src[ u ] ) {\n\n\t\t\tconst property = src[ u ][ p ];\n\n\t\t\tif ( property && ( property.isColor ||\n\t\t\t\tproperty.isMatrix3 || property.isMatrix4 ||\n\t\t\t\tproperty.isVector2 || property.isVector3 || property.isVector4 ||\n\t\t\t\tproperty.isTexture || property.isQuaternion ) ) {\n\n\t\t\t\tif ( property.isRenderTargetTexture ) {\n\n\t\t\t\t\tconsole.warn( 'UniformsUtils: Textures of render targets cannot be cloned via cloneUniforms() or mergeUniforms().' );\n\t\t\t\t\tdst[ u ][ p ] = null;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdst[ u ][ p ] = property.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( Array.isArray( property ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.slice();\n\n\t\t\t} else {\n\n\t\t\t\tdst[ u ][ p ] = property;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn dst;\n\n}\n\nfunction mergeUniforms( uniforms ) {\n\n\tconst merged = {};\n\n\tfor ( let u = 0; u < uniforms.length; u ++ ) {\n\n\t\tconst tmp = cloneUniforms( uniforms[ u ] );\n\n\t\tfor ( const p in tmp ) {\n\n\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t}\n\n\t}\n\n\treturn merged;\n\n}\n\nfunction cloneUniformsGroups( src ) {\n\n\tconst dst = [];\n\n\tfor ( let u = 0; u < src.length; u ++ ) {\n\n\t\tdst.push( src[ u ].clone() );\n\n\t}\n\n\treturn dst;\n\n}\n\nfunction getUnlitUniformColorSpace( renderer ) {\n\n\tif ( renderer.getRenderTarget() === null ) {\n\n\t\t// https://github.com/mrdoob/three.js/pull/23937#issuecomment-1111067398\n\t\treturn renderer.outputColorSpace;\n\n\t}\n\n\treturn ColorManagement.workingColorSpace;\n\n}\n\n// Legacy\n\nconst UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms };\n\nvar default_vertex = \"void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\";\n\nvar default_fragment = \"void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}\";\n\nclass ShaderMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isShaderMaterial = true;\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\tthis.defines = {};\n\t\tthis.uniforms = {};\n\t\tthis.uniformsGroups = [];\n\n\t\tthis.vertexShader = default_vertex;\n\t\tthis.fragmentShader = default_fragment;\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false; // set to use scene fog\n\t\tthis.lights = false; // set to use scene lights\n\t\tthis.clipping = false; // set to use user-defined clipping planes\n\n\t\tthis.forceSinglePass = true;\n\n\t\tthis.extensions = {\n\t\t\tderivatives: false, // set to use derivatives\n\t\t\tfragDepth: false, // set to use fragment depth values\n\t\t\tdrawBuffers: false, // set to use draw buffers\n\t\t\tshaderTextureLOD: false // set to use shader texture LOD\n\t\t};\n\n\t\t// When rendered geometry doesn't include these attributes but the material does,\n\t\t// use these default values in WebGL. This avoids errors when buffer data is missing.\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv1': [ 0, 0 ]\n\t\t};\n\n\t\tthis.index0AttributeName = undefined;\n\t\tthis.uniformsNeedUpdate = false;\n\n\t\tthis.glslVersion = null;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = cloneUniforms( source.uniforms );\n\t\tthis.uniformsGroups = cloneUniformsGroups( source.uniformsGroups );\n\n\t\tthis.defines = Object.assign( {}, source.defines );\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.fog = source.fog;\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.extensions = Object.assign( {}, source.extensions );\n\n\t\tthis.glslVersion = source.glslVersion;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.glslVersion = this.glslVersion;\n\t\tdata.uniforms = {};\n\n\t\tfor ( const name in this.uniforms ) {\n\n\t\t\tconst uniform = this.uniforms[ name ];\n\t\t\tconst value = uniform.value;\n\n\t\t\tif ( value && value.isTexture ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 't',\n\t\t\t\t\tvalue: value.toJSON( meta ).uuid\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isColor ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'c',\n\t\t\t\t\tvalue: value.getHex()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector2 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v2',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\tvalue: value\n\t\t\t\t};\n\n\t\t\t\t// note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines;\n\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\tdata.lights = this.lights;\n\t\tdata.clipping = this.clipping;\n\n\t\tconst extensions = {};\n\n\t\tfor ( const key in this.extensions ) {\n\n\t\t\tif ( this.extensions[ key ] === true ) extensions[ key ] = true;\n\n\t\t}\n\n\t\tif ( Object.keys( extensions ).length > 0 ) data.extensions = extensions;\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass Camera extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isCamera = true;\n\n\t\tthis.type = 'Camera';\n\n\t\tthis.matrixWorldInverse = new Matrix4();\n\n\t\tthis.projectionMatrix = new Matrix4();\n\t\tthis.projectionMatrixInverse = new Matrix4();\n\n\t\tthis.coordinateSystem = WebGLCoordinateSystem;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\t\tthis.projectionMatrixInverse.copy( source.projectionMatrixInverse );\n\n\t\tthis.coordinateSystem = source.coordinateSystem;\n\n\t\treturn this;\n\n\t}\n\n\tgetWorldDirection( target ) {\n\n\t\treturn super.getWorldDirection( target ).negate();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tsuper.updateWorldMatrix( updateParents, updateChildren );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nclass PerspectiveCamera extends Camera {\n\n\tconstructor( fov = 50, aspect = 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\tthis.isPerspectiveCamera = true;\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\tthis.fov = fov;\n\t\tthis.zoom = 1;\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\t\tthis.focus = 10;\n\n\t\tthis.aspect = aspect;\n\t\tthis.view = null;\n\n\t\tthis.filmGauge = 35;\t// width of the film (default in millimeters)\n\t\tthis.filmOffset = 0;\t// horizontal film offset (same unit as gauge)\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( 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( focalLength ) {\n\n\t\t/** see {@link http://www.bobatkins.com/photography/technical/field_of_view.html} */\n\t\tconst vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\tthis.fov = 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() {\n\n\t\tconst vExtentSlope = Math.tan( DEG2RAD * 0.5 * this.fov );\n\n\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t}\n\n\tgetEffectiveFOV() {\n\n\t\treturn RAD2DEG * 2 * Math.atan(\n\t\t\tMath.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t}\n\n\tgetFilmWidth() {\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() {\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 * const w = 1920;\n\t * const h = 1080;\n\t * const fullWidth = w * 3;\n\t * const fullHeight = h * 2;\n\t *\n\t * --A--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t * --B--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t * --C--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t * --D--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t * --E--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t * --F--\n\t * camera.setViewOffset( 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( 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() {\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() {\n\n\t\tconst near = this.near;\n\t\tlet top = near * Math.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom;\n\t\tlet height = 2 * top;\n\t\tlet width = this.aspect * height;\n\t\tlet left = - 0.5 * width;\n\t\tconst view = this.view;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst 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\tconst 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, this.coordinateSystem );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( 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\nconst fov = - 90; // negative fov is not an error\nconst aspect = 1;\n\nclass CubeCamera extends Object3D {\n\n\tconstructor( near, far, renderTarget ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CubeCamera';\n\n\t\tthis.renderTarget = renderTarget;\n\t\tthis.coordinateSystem = null;\n\t\tthis.activeMipmapLevel = 0;\n\n\t\tconst cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.layers = this.layers;\n\t\tthis.add( cameraPX );\n\n\t\tconst cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.layers = this.layers;\n\t\tthis.add( cameraNX );\n\n\t\tconst cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.layers = this.layers;\n\t\tthis.add( cameraPY );\n\n\t\tconst cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.layers = this.layers;\n\t\tthis.add( cameraNY );\n\n\t\tconst cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.layers = this.layers;\n\t\tthis.add( cameraPZ );\n\n\t\tconst cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.layers = this.layers;\n\t\tthis.add( cameraNZ );\n\n\t}\n\n\tupdateCoordinateSystem() {\n\n\t\tconst coordinateSystem = this.coordinateSystem;\n\n\t\tconst cameras = this.children.concat();\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = cameras;\n\n\t\tfor ( const camera of cameras ) this.remove( camera );\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tcameraPX.up.set( 0, 1, 0 );\n\t\t\tcameraPX.lookAt( 1, 0, 0 );\n\n\t\t\tcameraNX.up.set( 0, 1, 0 );\n\t\t\tcameraNX.lookAt( - 1, 0, 0 );\n\n\t\t\tcameraPY.up.set( 0, 0, - 1 );\n\t\t\tcameraPY.lookAt( 0, 1, 0 );\n\n\t\t\tcameraNY.up.set( 0, 0, 1 );\n\t\t\tcameraNY.lookAt( 0, - 1, 0 );\n\n\t\t\tcameraPZ.up.set( 0, 1, 0 );\n\t\t\tcameraPZ.lookAt( 0, 0, 1 );\n\n\t\t\tcameraNZ.up.set( 0, 1, 0 );\n\t\t\tcameraNZ.lookAt( 0, 0, - 1 );\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tcameraPX.up.set( 0, - 1, 0 );\n\t\t\tcameraPX.lookAt( - 1, 0, 0 );\n\n\t\t\tcameraNX.up.set( 0, - 1, 0 );\n\t\t\tcameraNX.lookAt( 1, 0, 0 );\n\n\t\t\tcameraPY.up.set( 0, 0, 1 );\n\t\t\tcameraPY.lookAt( 0, 1, 0 );\n\n\t\t\tcameraNY.up.set( 0, 0, - 1 );\n\t\t\tcameraNY.lookAt( 0, - 1, 0 );\n\n\t\t\tcameraPZ.up.set( 0, - 1, 0 );\n\t\t\tcameraPZ.lookAt( 0, 0, 1 );\n\n\t\t\tcameraNZ.up.set( 0, - 1, 0 );\n\t\t\tcameraNZ.lookAt( 0, 0, - 1 );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\tfor ( const camera of cameras ) {\n\n\t\t\tthis.add( camera );\n\n\t\t\tcamera.updateMatrixWorld();\n\n\t\t}\n\n\t}\n\n\tupdate( renderer, scene ) {\n\n\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\tconst { renderTarget, activeMipmapLevel } = this;\n\n\t\tif ( this.coordinateSystem !== renderer.coordinateSystem ) {\n\n\t\t\tthis.coordinateSystem = renderer.coordinateSystem;\n\n\t\t\tthis.updateCoordinateSystem();\n\n\t\t}\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = this.children;\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst currentActiveCubeFace = renderer.getActiveCubeFace();\n\t\tconst currentActiveMipmapLevel = renderer.getActiveMipmapLevel();\n\n\t\tconst currentXrEnabled = renderer.xr.enabled;\n\n\t\trenderer.xr.enabled = false;\n\n\t\tconst generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\trenderer.setRenderTarget( renderTarget, 0, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPX );\n\n\t\trenderer.setRenderTarget( renderTarget, 1, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNX );\n\n\t\trenderer.setRenderTarget( renderTarget, 2, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPY );\n\n\t\trenderer.setRenderTarget( renderTarget, 3, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNY );\n\n\t\trenderer.setRenderTarget( renderTarget, 4, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPZ );\n\n\t\t// mipmaps are generated during the last call of render()\n\t\t// at this point, all sides of the cube render target are defined\n\n\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\trenderer.setRenderTarget( renderTarget, 5, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNZ );\n\n\t\trenderer.setRenderTarget( currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel );\n\n\t\trenderer.xr.enabled = currentXrEnabled;\n\n\t\trenderTarget.texture.needsPMREMUpdate = true;\n\n\t}\n\n}\n\nclass CubeTexture extends Texture {\n\n\tconstructor( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace ) {\n\n\t\timages = images !== undefined ? images : [];\n\t\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\t\tsuper( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\tthis.isCubeTexture = true;\n\n\t\tthis.flipY = false;\n\n\t}\n\n\tget images() {\n\n\t\treturn this.image;\n\n\t}\n\n\tset images( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n}\n\nclass WebGLCubeRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( size = 1, options = {} ) {\n\n\t\tsuper( size, size, options );\n\n\t\tthis.isWebGLCubeRenderTarget = true;\n\n\t\tconst image = { width: size, height: size, depth: 1 };\n\t\tconst images = [ image, image, image, image, image, image ];\n\n\t\tif ( options.encoding !== undefined ) {\n\n\t\t\t// @deprecated, r152\n\t\t\twarnOnce( 'THREE.WebGLCubeRenderTarget: option.encoding has been replaced by option.colorSpace.' );\n\t\t\toptions.colorSpace = options.encoding === sRGBEncoding ? SRGBColorSpace : NoColorSpace;\n\n\t\t}\n\n\t\tthis.texture = new CubeTexture( images, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.colorSpace );\n\n\t\t// By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js)\n\t\t// in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words,\n\t\t// in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly.\n\n\t\t// three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped\n\t\t// and the flag isRenderTargetTexture controls this conversion. The flip is not required when using WebGLCubeRenderTarget.texture\n\t\t// as a cube texture (this is detected when isRenderTargetTexture is set to true for cube textures).\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t\tthis.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;\n\t\tthis.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;\n\n\t}\n\n\tfromEquirectangularTexture( renderer, texture ) {\n\n\t\tthis.texture.type = texture.type;\n\t\tthis.texture.colorSpace = texture.colorSpace;\n\n\t\tthis.texture.generateMipmaps = texture.generateMipmaps;\n\t\tthis.texture.minFilter = texture.minFilter;\n\t\tthis.texture.magFilter = texture.magFilter;\n\n\t\tconst shader = {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include <begin_vertex>\n\t\t\t\t\t#include <project_vertex>\n\n\t\t\t\t}\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include <common>\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tconst geometry = new BoxGeometry( 5, 5, 5 );\n\n\t\tconst material = new ShaderMaterial( {\n\n\t\t\tname: 'CubemapFromEquirect',\n\n\t\t\tuniforms: cloneUniforms( shader.uniforms ),\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tside: BackSide,\n\t\t\tblending: NoBlending\n\n\t\t} );\n\n\t\tmaterial.uniforms.tEquirect.value = texture;\n\n\t\tconst mesh = new Mesh( geometry, material );\n\n\t\tconst currentMinFilter = texture.minFilter;\n\n\t\t// Avoid blurred poles\n\t\tif ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter;\n\n\t\tconst camera = new CubeCamera( 1, 10, this );\n\t\tcamera.update( renderer, mesh );\n\n\t\ttexture.minFilter = currentMinFilter;\n\n\t\tmesh.geometry.dispose();\n\t\tmesh.material.dispose();\n\n\t\treturn this;\n\n\t}\n\n\tclear( renderer, color, depth, stencil ) {\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\trenderer.setRenderTarget( this, i );\n\n\t\t\trenderer.clear( color, depth, stencil );\n\n\t\t}\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n}\n\nconst _vector1 = /*@__PURE__*/ new Vector3();\nconst _vector2 = /*@__PURE__*/ new Vector3();\nconst _normalMatrix = /*@__PURE__*/ new Matrix3();\n\nclass Plane {\n\n\tconstructor( normal = new Vector3( 1, 0, 0 ), constant = 0 ) {\n\n\t\tthis.isPlane = true;\n\n\t\t// normal is assumed to be normalized\n\n\t\tthis.normal = normal;\n\t\tthis.constant = constant;\n\n\t}\n\n\tset( 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( 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( 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( a, b, c ) {\n\n\t\tconst normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize();\n\n\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( 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() {\n\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tconst 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() {\n\n\t\tthis.constant *= - 1;\n\t\tthis.normal.negate();\n\n\t\treturn this;\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn this.normal.dot( point ) + this.constant;\n\n\t}\n\n\tdistanceToSphere( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t}\n\n\tprojectPoint( point, target ) {\n\n\t\treturn target.copy( point ).addScaledVector( this.normal, - this.distanceToPoint( point ) );\n\n\t}\n\n\tintersectLine( line, target ) {\n\n\t\tconst direction = line.delta( _vector1 );\n\n\t\tconst denominator = this.normal.dot( direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\treturn target.copy( line.start );\n\n\t\t\t}\n\n\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn target.copy( line.start ).addScaledVector( direction, t );\n\n\t}\n\n\tintersectsLine( 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\tconst startSign = this.distanceToPoint( line.start );\n\t\tconst endSign = this.distanceToPoint( line.end );\n\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsPlane( this );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn sphere.intersectsPlane( this );\n\n\t}\n\n\tcoplanarPoint( target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t}\n\n\tapplyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\tconst normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix );\n\n\t\tconst referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix );\n\n\t\tconst normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.constant -= offset.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\tequals( plane ) {\n\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _sphere$4 = /*@__PURE__*/ new Sphere();\nconst _vector$6 = /*@__PURE__*/ new Vector3();\n\nclass Frustum {\n\n\tconstructor( p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane() ) {\n\n\t\tthis.planes = [ p0, p1, p2, p3, p4, p5 ];\n\n\t}\n\n\tset( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tconst 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\tcopy( frustum ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let 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\tsetFromProjectionMatrix( m, coordinateSystem = WebGLCoordinateSystem ) {\n\n\t\tconst planes = this.planes;\n\t\tconst me = m.elements;\n\t\tconst me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\tconst me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\tconst me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\tconst 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\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tplanes[ 5 ].setComponents( me2, me6, me10, me14 ).normalize();\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tintersectsObject( object ) {\n\n\t\tif ( object.boundingSphere !== undefined ) {\n\n\t\t\tif ( object.boundingSphere === null ) object.computeBoundingSphere();\n\n\t\t\t_sphere$4.copy( object.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t} else {\n\n\t\t\tconst geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t_sphere$4.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t}\n\n\t\treturn this.intersectsSphere( _sphere$4 );\n\n\t}\n\n\tintersectsSprite( sprite ) {\n\n\t\t_sphere$4.center.set( 0, 0, 0 );\n\t\t_sphere$4.radius = 0.7071067811865476;\n\t\t_sphere$4.applyMatrix4( sprite.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere$4 );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\tconst planes = this.planes;\n\t\tconst center = sphere.center;\n\t\tconst negRadius = - sphere.radius;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst 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( box ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst plane = planes[ i ];\n\n\t\t\t// corner at max distance\n\n\t\t\t_vector$6.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t_vector$6.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t_vector$6.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\tif ( plane.distanceToPoint( _vector$6 ) < 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\tcontainsPoint( point ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let 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\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nfunction WebGLAnimation() {\n\n\tlet context = null;\n\tlet isAnimating = false;\n\tlet animationLoop = null;\n\tlet requestId = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tanimationLoop( time, frame );\n\n\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t}\n\n\treturn {\n\n\t\tstart: function () {\n\n\t\t\tif ( isAnimating === true ) return;\n\t\t\tif ( animationLoop === null ) return;\n\n\t\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t\t\tisAnimating = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tcontext.cancelAnimationFrame( requestId );\n\n\t\t\tisAnimating = false;\n\n\t\t},\n\n\t\tsetAnimationLoop: function ( callback ) {\n\n\t\t\tanimationLoop = callback;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLAttributes( gl, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tconst buffers = new WeakMap();\n\n\tfunction createBuffer( attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst usage = attribute.usage;\n\n\t\tconst 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\tlet type;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\ttype = gl.FLOAT;\n\n\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\tif ( attribute.isFloat16BufferAttribute ) {\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\ttype = gl.HALF_FLOAT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t\t}\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} else if ( array instanceof Uint8ClampedArray ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.WebGLAttributes: Unsupported buffer data format: ' + array );\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\tconst array = attribute.array;\n\t\tconst updateRange = attribute.updateRange;\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\n\t\tif ( 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 {\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray, updateRange.offset, updateRange.count );\n\n\t\t\t} else {\n\n\t\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray.subarray( updateRange.offset, updateRange.offset + updateRange.count ) );\n\n\t\t\t}\n\n\t\t\tupdateRange.count = - 1; // reset range\n\n\t\t}\n\n\t\tattribute.onUploadCallback();\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\tconst 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.isGLBufferAttribute ) {\n\n\t\t\tconst cached = buffers.get( attribute );\n\n\t\t\tif ( ! cached || cached.version < attribute.version ) {\n\n\t\t\t\tbuffers.set( attribute, {\n\t\t\t\t\tbuffer: attribute.buffer,\n\t\t\t\t\ttype: attribute.type,\n\t\t\t\t\tbytesPerElement: attribute.elementSize,\n\t\t\t\t\tversion: attribute.version\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst 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\nclass PlaneGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PlaneGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tconst width_half = width / 2;\n\t\tconst height_half = height / 2;\n\n\t\tconst gridX = Math.floor( widthSegments );\n\t\tconst gridY = Math.floor( heightSegments );\n\n\t\tconst gridX1 = gridX + 1;\n\t\tconst gridY1 = gridY + 1;\n\n\t\tconst segment_width = width / gridX;\n\t\tconst segment_height = height / gridY;\n\n\t\t//\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tconst y = iy * segment_height - height_half;\n\n\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\tconst b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tconst c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tconst d = ( ix + 1 ) + gridX1 * iy;\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\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments );\n\n\t}\n\n}\n\nvar alphahash_fragment = \"#ifdef USE_ALPHAHASH\\n\\tif ( diffuseColor.a < getAlphaHashThreshold( vPosition ) ) discard;\\n#endif\";\n\nvar alphahash_pars_fragment = \"#ifdef USE_ALPHAHASH\\n\\tconst float ALPHA_HASH_SCALE = 0.05;\\n\\tfloat hash2D( vec2 value ) {\\n\\t\\treturn fract( 1.0e4 * sin( 17.0 * value.x + 0.1 * value.y ) * ( 0.1 + abs( sin( 13.0 * value.y + value.x ) ) ) );\\n\\t}\\n\\tfloat hash3D( vec3 value ) {\\n\\t\\treturn hash2D( vec2( hash2D( value.xy ), value.z ) );\\n\\t}\\n\\tfloat getAlphaHashThreshold( vec3 position ) {\\n\\t\\tfloat maxDeriv = max(\\n\\t\\t\\tlength( dFdx( position.xyz ) ),\\n\\t\\t\\tlength( dFdy( position.xyz ) )\\n\\t\\t);\\n\\t\\tfloat pixScale = 1.0 / ( ALPHA_HASH_SCALE * maxDeriv );\\n\\t\\tvec2 pixScales = vec2(\\n\\t\\t\\texp2( floor( log2( pixScale ) ) ),\\n\\t\\t\\texp2( ceil( log2( pixScale ) ) )\\n\\t\\t);\\n\\t\\tvec2 alpha = vec2(\\n\\t\\t\\thash3D( floor( pixScales.x * position.xyz ) ),\\n\\t\\t\\thash3D( floor( pixScales.y * position.xyz ) )\\n\\t\\t);\\n\\t\\tfloat lerpFactor = fract( log2( pixScale ) );\\n\\t\\tfloat x = ( 1.0 - lerpFactor ) * alpha.x + lerpFactor * alpha.y;\\n\\t\\tfloat a = min( lerpFactor, 1.0 - lerpFactor );\\n\\t\\tvec3 cases = vec3(\\n\\t\\t\\tx * x / ( 2.0 * a * ( 1.0 - a ) ),\\n\\t\\t\\t( x - 0.5 * a ) / ( 1.0 - a ),\\n\\t\\t\\t1.0 - ( ( 1.0 - x ) * ( 1.0 - x ) / ( 2.0 * a * ( 1.0 - a ) ) )\\n\\t\\t);\\n\\t\\tfloat threshold = ( x < ( 1.0 - a ) )\\n\\t\\t\\t? ( ( x < a ) ? cases.x : cases.y )\\n\\t\\t\\t: cases.z;\\n\\t\\treturn clamp( threshold , 1.0e-6, 1.0 );\\n\\t}\\n#endif\";\n\nvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g;\\n#endif\";\n\nvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar alphatest_fragment = \"#ifdef USE_ALPHATEST\\n\\tif ( diffuseColor.a < alphaTest ) discard;\\n#endif\";\n\nvar alphatest_pars_fragment = \"#ifdef USE_ALPHATEST\\n\\tuniform float alphaTest;\\n#endif\";\n\nvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_CLEARCOAT ) \\n\\t\\tclearcoatSpecularIndirect *= ambientOcclusion;\\n\\t#endif\\n\\t#if defined( USE_SHEEN ) \\n\\t\\tsheenSpecularIndirect *= ambientOcclusion;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD )\\n\\t\\tfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\\n\\t#endif\\n#endif\";\n\nvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\nvar begin_vertex = \"vec3 transformed = vec3( position );\\n#ifdef USE_ALPHAHASH\\n\\tvPosition = vec3( position );\\n#endif\";\n\nvar beginnormal_vertex = \"vec3 objectNormal = vec3( normal );\\n#ifdef USE_TANGENT\\n\\tvec3 objectTangent = vec3( tangent.xyz );\\n#endif\";\n\nvar bsdfs = \"float 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_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n} // validated\";\n\nvar iridescence_fragment = \"#ifdef USE_IRIDESCENCE\\n\\tconst mat3 XYZ_TO_REC709 = mat3(\\n\\t\\t 3.2404542, -0.9692660, 0.0556434,\\n\\t\\t-1.5371385, 1.8760108, -0.2040259,\\n\\t\\t-0.4985314, 0.0415560, 1.0572252\\n\\t);\\n\\tvec3 Fresnel0ToIor( vec3 fresnel0 ) {\\n\\t\\tvec3 sqrtF0 = sqrt( fresnel0 );\\n\\t\\treturn ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\\n\\t}\\n\\tvec3 IorToFresnel0( vec3 transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\\n\\t}\\n\\tfloat IorToFresnel0( float transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ));\\n\\t}\\n\\tvec3 evalSensitivity( float OPD, vec3 shift ) {\\n\\t\\tfloat phase = 2.0 * PI * OPD * 1.0e-9;\\n\\t\\tvec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\\n\\t\\tvec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\\n\\t\\tvec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\\n\\t\\tvec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * var );\\n\\t\\txyz.x += 9.7470e-14 * sqrt( 2.0 * PI * 4.5282e+09 ) * cos( 2.2399e+06 * phase + shift[ 0 ] ) * exp( - 4.5282e+09 * pow2( phase ) );\\n\\t\\txyz /= 1.0685e-7;\\n\\t\\tvec3 rgb = XYZ_TO_REC709 * xyz;\\n\\t\\treturn rgb;\\n\\t}\\n\\tvec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\\n\\t\\tvec3 I;\\n\\t\\tfloat iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\\n\\t\\tfloat sinTheta2Sq = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) );\\n\\t\\tfloat cosTheta2Sq = 1.0 - sinTheta2Sq;\\n\\t\\tif ( cosTheta2Sq < 0.0 ) {\\n\\t\\t\\treturn vec3( 1.0 );\\n\\t\\t}\\n\\t\\tfloat cosTheta2 = sqrt( cosTheta2Sq );\\n\\t\\tfloat R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\\n\\t\\tfloat R12 = F_Schlick( R0, 1.0, cosTheta1 );\\n\\t\\tfloat T121 = 1.0 - R12;\\n\\t\\tfloat phi12 = 0.0;\\n\\t\\tif ( iridescenceIOR < outsideIOR ) phi12 = PI;\\n\\t\\tfloat phi21 = PI - phi12;\\n\\t\\tvec3 baseIOR = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) );\\t\\tvec3 R1 = IorToFresnel0( baseIOR, iridescenceIOR );\\n\\t\\tvec3 R23 = F_Schlick( R1, 1.0, cosTheta2 );\\n\\t\\tvec3 phi23 = vec3( 0.0 );\\n\\t\\tif ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = PI;\\n\\t\\tif ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = PI;\\n\\t\\tif ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = PI;\\n\\t\\tfloat OPD = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2;\\n\\t\\tvec3 phi = vec3( phi21 ) + phi23;\\n\\t\\tvec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\\n\\t\\tvec3 r123 = sqrt( R123 );\\n\\t\\tvec3 Rs = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\\n\\t\\tvec3 C0 = R12 + Rs;\\n\\t\\tI = C0;\\n\\t\\tvec3 Cm = Rs - T121;\\n\\t\\tfor ( int m = 1; m <= 2; ++ m ) {\\n\\t\\t\\tCm *= r123;\\n\\t\\t\\tvec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\\n\\t\\t\\tI += Cm * Sm;\\n\\t\\t}\\n\\t\\treturn max( I, vec3( 0.0 ) );\\n\\t}\\n#endif\";\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( vBumpMapUv );\\n\\t\\tvec2 dSTdy = dFdy( vBumpMapUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vBumpMapUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\\n\\t\\tvec3 vSigmaX = normalize( dFdx( surf_pos.xyz ) );\\n\\t\\tvec3 vSigmaY = normalize( dFdy( surf_pos.xyz ) );\\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 ) * faceDirection;\\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\nvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvec4 plane;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\tplane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\tif ( clipped ) discard;\\n\\t#endif\\n#endif\";\n\nvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\";\n\nvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n#endif\";\n\nvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvClipPosition = - mvPosition.xyz;\\n#endif\";\n\nvar color_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tdiffuseColor *= vColor;\\n#elif defined( USE_COLOR )\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\nvar color_pars_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_pars_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvColor = vec4( 1.0 );\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\\n\\tvColor = vec3( 1.0 );\\n#endif\\n#ifdef USE_COLOR\\n\\tvColor *= color;\\n#endif\\n#ifdef USE_INSTANCING_COLOR\\n\\tvColor.xyz *= instanceColor.xyz;\\n#endif\";\n\nvar common = \"#define PI 3.141592653589793\\n#define PI2 6.283185307179586\\n#define PI_HALF 1.5707963267948966\\n#define RECIPROCAL_PI 0.3183098861837907\\n#define RECIPROCAL_PI2 0.15915494309189535\\n#define EPSILON 1e-6\\n#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nvec3 pow2( const in vec3 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 max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\\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}\\n#ifdef HIGH_PRECISION\\n\\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\\n#else\\n\\tfloat precisionSafeLength( vec3 v ) {\\n\\t\\tfloat maxComponent = max3( abs( v ) );\\n\\t\\treturn length( v / maxComponent ) * maxComponent;\\n\\t}\\n#endif\\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};\\n#ifdef USE_ALPHAHASH\\n\\tvarying vec3 vPosition;\\n#endif\\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}\\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 luminance( const in vec3 rgb ) {\\n\\tconst vec3 weights = vec3( 0.2126729, 0.7151522, 0.0721750 );\\n\\treturn dot( weights, rgb );\\n}\\nbool isPerspectiveMatrix( mat4 m ) {\\n\\treturn m[ 2 ][ 3 ] == - 1.0;\\n}\\nvec2 equirectUv( in vec3 dir ) {\\n\\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\treturn vec2( u, v );\\n}\\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n}\\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n} // validated\";\n\nvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t#define cubeUV_minMipLevel 4.0\\n\\t#define cubeUV_minTileSize 16.0\\n\\tfloat getFace( vec3 direction ) {\\n\\t\\tvec3 absDirection = abs( direction );\\n\\t\\tfloat face = - 1.0;\\n\\t\\tif ( absDirection.x > absDirection.z ) {\\n\\t\\t\\tif ( absDirection.x > absDirection.y )\\n\\t\\t\\t\\tface = direction.x > 0.0 ? 0.0 : 3.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t} else {\\n\\t\\t\\tif ( absDirection.z > absDirection.y )\\n\\t\\t\\t\\tface = direction.z > 0.0 ? 2.0 : 5.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t}\\n\\t\\treturn face;\\n\\t}\\n\\tvec2 getUV( vec3 direction, float face ) {\\n\\t\\tvec2 uv;\\n\\t\\tif ( face == 0.0 ) {\\n\\t\\t\\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 1.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\\n\\t\\t} else if ( face == 2.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\\n\\t\\t} else if ( face == 3.0 ) {\\n\\t\\t\\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 4.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\\n\\t\\t} else {\\n\\t\\t\\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\\n\\t\\t}\\n\\t\\treturn 0.5 * ( uv + 1.0 );\\n\\t}\\n\\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\\n\\t\\tfloat face = getFace( direction );\\n\\t\\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\\n\\t\\tmipInt = max( mipInt, cubeUV_minMipLevel );\\n\\t\\tfloat faceSize = exp2( mipInt );\\n\\t\\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\\n\\t\\tif ( face > 2.0 ) {\\n\\t\\t\\tuv.y += faceSize;\\n\\t\\t\\tface -= 3.0;\\n\\t\\t}\\n\\t\\tuv.x += face * faceSize;\\n\\t\\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\\n\\t\\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\\n\\t\\tuv.x *= CUBEUV_TEXEL_WIDTH;\\n\\t\\tuv.y *= CUBEUV_TEXEL_HEIGHT;\\n\\t\\t#ifdef texture2DGradEXT\\n\\t\\t\\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn texture2D( envMap, uv ).rgb;\\n\\t\\t#endif\\n\\t}\\n\\t#define cubeUV_r0 1.0\\n\\t#define cubeUV_v0 0.339\\n\\t#define cubeUV_m0 - 2.0\\n\\t#define cubeUV_r1 0.8\\n\\t#define cubeUV_v1 0.276\\n\\t#define cubeUV_m1 - 1.0\\n\\t#define cubeUV_r4 0.4\\n\\t#define cubeUV_v4 0.046\\n\\t#define cubeUV_m4 2.0\\n\\t#define cubeUV_r5 0.305\\n\\t#define cubeUV_v5 0.016\\n\\t#define cubeUV_m5 3.0\\n\\t#define cubeUV_r6 0.21\\n\\t#define cubeUV_v6 0.0038\\n\\t#define cubeUV_m6 4.0\\n\\tfloat roughnessToMip( float roughness ) {\\n\\t\\tfloat mip = 0.0;\\n\\t\\tif ( roughness >= cubeUV_r1 ) {\\n\\t\\t\\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\\n\\t\\t} else if ( roughness >= cubeUV_r4 ) {\\n\\t\\t\\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\\n\\t\\t} else if ( roughness >= cubeUV_r5 ) {\\n\\t\\t\\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\\n\\t\\t} else if ( roughness >= cubeUV_r6 ) {\\n\\t\\t\\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\\n\\t\\t} else {\\n\\t\\t\\tmip = - 2.0 * log2( 1.16 * roughness );\\t\\t}\\n\\t\\treturn mip;\\n\\t}\\n\\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\\n\\t\\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\\n\\t\\tfloat mipF = fract( mip );\\n\\t\\tfloat mipInt = floor( mip );\\n\\t\\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\\n\\t\\tif ( mipF == 0.0 ) {\\n\\t\\t\\treturn vec4( color0, 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\\n\\t\\t\\treturn vec4( mix( color0, color1, mipF ), 1.0 );\\n\\t\\t}\\n\\t}\\n#endif\";\n\nvar defaultnormal_vertex = \"vec3 transformedNormal = objectNormal;\\n#ifdef USE_INSTANCING\\n\\tmat3 m = mat3( instanceMatrix );\\n\\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\\n\\ttransformedNormal = m * transformedNormal;\\n#endif\\ntransformedNormal = normalMatrix * transformedNormal;\\n#ifdef FLIP_SIDED\\n\\ttransformedNormal = - transformedNormal;\\n#endif\\n#ifdef USE_TANGENT\\n\\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#ifdef FLIP_SIDED\\n\\t\\ttransformedTangent = - transformedTangent;\\n\\t#endif\\n#endif\";\n\nvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\";\n\nvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\\n#endif\";\n\nvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\";\n\nvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\";\n\nvar colorspace_fragment = \"gl_FragColor = linearToOutputTexel( gl_FragColor );\";\n\nvar colorspace_pars_fragment = \"\\nconst mat3 LINEAR_SRGB_TO_LINEAR_DISPLAY_P3 = mat3(\\n\\tvec3( 0.8224621, 0.177538, 0.0 ),\\n\\tvec3( 0.0331941, 0.9668058, 0.0 ),\\n\\tvec3( 0.0170827, 0.0723974, 0.9105199 )\\n);\\nconst mat3 LINEAR_DISPLAY_P3_TO_LINEAR_SRGB = mat3(\\n\\tvec3( 1.2249401, - 0.2249404, 0.0 ),\\n\\tvec3( - 0.0420569, 1.0420571, 0.0 ),\\n\\tvec3( - 0.0196376, - 0.0786361, 1.0982735 )\\n);\\nvec4 LinearSRGBToLinearDisplayP3( in vec4 value ) {\\n\\treturn vec4( value.rgb * LINEAR_SRGB_TO_LINEAR_DISPLAY_P3, value.a );\\n}\\nvec4 LinearDisplayP3ToLinearSRGB( in vec4 value ) {\\n\\treturn vec4( value.rgb * LINEAR_DISPLAY_P3_TO_LINEAR_SRGB, value.a );\\n}\\nvec4 LinearTransferOETF( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 sRGBTransferOETF( 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 LinearToLinear( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 LinearTosRGB( in vec4 value ) {\\n\\treturn sRGBTransferOETF( value );\\n}\";\n\nvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvec3 cameraToFrag;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToFrag, 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#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\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\nvar envmap_common_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float envMapIntensity;\\n\\tuniform float flipEnvMap;\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\t\\n#endif\";\n\nvar envmap_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float reflectivity;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\t\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\";\n\nvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\t}\\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\nvar fog_vertex = \"#ifdef USE_FOG\\n\\tvFogDepth = - mvPosition.z;\\n#endif\";\n\nvar fog_pars_vertex = \"#ifdef USE_FOG\\n\\tvarying float vFogDepth;\\n#endif\";\n\nvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\";\n\nvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float vFogDepth;\\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\nvar gradientmap_pars_fragment = \"#ifdef USE_GRADIENTMAP\\n\\tuniform sampler2D gradientMap;\\n#endif\\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\tfloat dotNL = dot( normal, lightDirection );\\n\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t#ifdef USE_GRADIENTMAP\\n\\t\\treturn vec3( texture2D( gradientMap, coord ).r );\\n\\t#else\\n\\t\\tvec2 fw = fwidth( coord ) * 0.5;\\n\\t\\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\\n\\t#endif\\n}\";\n\nvar lightmap_fragment = \"#ifdef USE_LIGHTMAP\\n\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\\n\\treflectedLight.indirectDiffuse += lightMapIrradiance;\\n#endif\";\n\nvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\nvar lights_lambert_fragment = \"LambertMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_lambert_pars_fragment = \"varying vec3 vViewPosition;\\nstruct LambertMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Lambert\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Lambert\";\n\nvar lights_pars_begin = \"uniform bool receiveShadow;\\nuniform vec3 ambientLightColor;\\n#if defined( USE_LIGHT_PROBES )\\n\\tuniform vec3 lightProbe[ 9 ];\\n#endif\\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\\n\\tfloat x = normal.x, y = normal.y, z = normal.z;\\n\\tvec3 result = shCoefficients[ 0 ] * 0.886227;\\n\\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\\n\\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\\n\\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\\n\\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\\n\\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\\n\\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\\n\\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\\n\\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\\n\\treturn result;\\n}\\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\\n\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\\n\\treturn irradiance;\\n}\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\treturn irradiance;\\n}\\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\t#if defined ( LEGACY_LIGHTS )\\n\\t\\tif ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\\n\\t\\t\\treturn pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );\\n\\t\\t}\\n\\t\\treturn 1.0;\\n\\t#else\\n\\t\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\t\\tif ( cutoffDistance > 0.0 ) {\\n\\t\\t\\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t\\t}\\n\\t\\treturn distanceFalloff;\\n\\t#endif\\n}\\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\\n\\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\\n\\t\\tlight.color = directionalLight.color;\\n\\t\\tlight.direction = directionalLight.direction;\\n\\t\\tlight.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};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\\n\\t\\tvec3 lVector = pointLight.position - geometryPosition;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tlight.color = pointLight.color;\\n\\t\\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tlight.visible = ( light.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};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\\n\\t\\tvec3 lVector = spotLight.position - geometryPosition;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat angleCos = dot( light.direction, spotLight.direction );\\n\\t\\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\tif ( spotAttenuation > 0.0 ) {\\n\\t\\t\\tfloat lightDistance = length( lVector );\\n\\t\\t\\tlight.color = spotLight.color * spotAttenuation;\\n\\t\\t\\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t\\t} else {\\n\\t\\t\\tlight.color = vec3( 0.0 );\\n\\t\\t\\tlight.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 vec3 normal ) {\\n\\t\\tfloat dotNL = dot( normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\";\n\nvar envmap_physical_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tvec3 getIBLIrradiance( const in vec3 normal ) {\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\\n\\t\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\tvec3 reflectVec = reflect( - viewDir, normal );\\n\\t\\t\\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\\n\\t\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\\n\\t\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\\n\\t\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\t\\tvec3 bentNormal = cross( bitangent, viewDir );\\n\\t\\t\\t\\tbentNormal = normalize( cross( bentNormal, bitangent ) );\\n\\t\\t\\t\\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\\n\\t\\t\\t\\treturn getIBLRadiance( viewDir, bentNormal, roughness );\\n\\t\\t\\t#else\\n\\t\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t#endif\\n#endif\";\n\nvar lights_toon_fragment = \"ToonMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\";\n\nvar lights_toon_pars_fragment = \"varying vec3 vViewPosition;\\nstruct ToonMaterial {\\n\\tvec3 diffuseColor;\\n};\\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Toon\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Toon\";\n\nvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\nstruct BlinnPhongMaterial {\\n\\tvec3 diffuseColor;\\n\\tvec3 specularColor;\\n\\tfloat specularShininess;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\";\n\nvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\\nmaterial.roughness = min( material.roughness, 1.0 );\\n#ifdef IOR\\n\\tmaterial.ior = ior;\\n\\t#ifdef USE_SPECULAR\\n\\t\\tfloat specularIntensityFactor = specularIntensity;\\n\\t\\tvec3 specularColorFactor = specularColor;\\n\\t\\t#ifdef USE_SPECULAR_COLORMAP\\n\\t\\t\\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\\n\\t\\t#endif\\n\\t\\t#ifdef USE_SPECULAR_INTENSITYMAP\\n\\t\\t\\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\\n\\t\\t#endif\\n\\t\\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\\n\\t#else\\n\\t\\tfloat specularIntensityFactor = 1.0;\\n\\t\\tvec3 specularColorFactor = vec3( 1.0 );\\n\\t\\tmaterial.specularF90 = 1.0;\\n\\t#endif\\n\\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.specularF90 = 1.0;\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tmaterial.clearcoat = clearcoat;\\n\\tmaterial.clearcoatRoughness = clearcoatRoughness;\\n\\tmaterial.clearcoatF0 = vec3( 0.04 );\\n\\tmaterial.clearcoatF90 = 1.0;\\n\\t#ifdef USE_CLEARCOATMAP\\n\\t\\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\t\\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\\n\\t#endif\\n\\tmaterial.clearcoat = saturate( material.clearcoat );\\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\\n\\tmaterial.clearcoatRoughness += geometryRoughness;\\n\\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tmaterial.iridescence = iridescence;\\n\\tmaterial.iridescenceIOR = iridescenceIOR;\\n\\t#ifdef USE_IRIDESCENCEMAP\\n\\t\\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\t\\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\\n\\t#else\\n\\t\\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\\n\\t#endif\\n#endif\\n#ifdef USE_SHEEN\\n\\tmaterial.sheenColor = sheenColor;\\n\\t#ifdef USE_SHEEN_COLORMAP\\n\\t\\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\\n\\t#endif\\n\\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\\n\\t#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\t\\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\\n\\t#endif\\n#endif\\n#ifdef USE_ANISOTROPY\\n\\t#ifdef USE_ANISOTROPYMAP\\n\\t\\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\\n\\t\\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\\n\\t\\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\\n\\t#else\\n\\t\\tvec2 anisotropyV = anisotropyVector;\\n\\t#endif\\n\\tmaterial.anisotropy = length( anisotropyV );\\n\\tanisotropyV /= material.anisotropy;\\n\\tmaterial.anisotropy = saturate( material.anisotropy );\\n\\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\\n\\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x - tbn[ 1 ] * anisotropyV.y;\\n\\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x + tbn[ 0 ] * anisotropyV.y;\\n#endif\";\n\nvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat roughness;\\n\\tvec3 specularColor;\\n\\tfloat specularF90;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat clearcoat;\\n\\t\\tfloat clearcoatRoughness;\\n\\t\\tvec3 clearcoatF0;\\n\\t\\tfloat clearcoatF90;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tfloat iridescence;\\n\\t\\tfloat iridescenceIOR;\\n\\t\\tfloat iridescenceThickness;\\n\\t\\tvec3 iridescenceFresnel;\\n\\t\\tvec3 iridescenceF0;\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tvec3 sheenColor;\\n\\t\\tfloat sheenRoughness;\\n\\t#endif\\n\\t#ifdef IOR\\n\\t\\tfloat ior;\\n\\t#endif\\n\\t#ifdef USE_TRANSMISSION\\n\\t\\tfloat transmission;\\n\\t\\tfloat transmissionAlpha;\\n\\t\\tfloat thickness;\\n\\t\\tfloat attenuationDistance;\\n\\t\\tvec3 attenuationColor;\\n\\t#endif\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tfloat anisotropy;\\n\\t\\tfloat alphaT;\\n\\t\\tvec3 anisotropyT;\\n\\t\\tvec3 anisotropyB;\\n\\t#endif\\n};\\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\\nvec3 sheenSpecularDirect = vec3( 0.0 );\\nvec3 sheenSpecularIndirect = vec3(0.0 );\\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\\n float x2 = x * x;\\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\\n}\\nfloat V_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}\\n#ifdef USE_ANISOTROPY\\n\\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\\n\\t\\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\\n\\t\\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\\n\\t\\tfloat v = 0.5 / ( gv + gl );\\n\\t\\treturn saturate(v);\\n\\t}\\n\\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\\n\\t\\tfloat a2 = alphaT * alphaB;\\n\\t\\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\\n\\t\\thighp float v2 = dot( v, v );\\n\\t\\tfloat w2 = a2 / v2;\\n\\t\\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\\n\\t}\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\\n\\t\\tvec3 f0 = material.clearcoatF0;\\n\\t\\tfloat f90 = material.clearcoatF90;\\n\\t\\tfloat roughness = material.clearcoatRoughness;\\n\\t\\tfloat alpha = pow2( roughness );\\n\\t\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\t\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\t\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\t\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\t\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\t\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t\\treturn F * ( V * D );\\n\\t}\\n#endif\\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\\n\\tvec3 f0 = material.specularColor;\\n\\tfloat f90 = material.specularF90;\\n\\tfloat roughness = material.roughness;\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tF = mix( F, material.iridescenceFresnel, material.iridescence );\\n\\t#endif\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tfloat dotTL = dot( material.anisotropyT, lightDir );\\n\\t\\tfloat dotTV = dot( material.anisotropyT, viewDir );\\n\\t\\tfloat dotTH = dot( material.anisotropyT, halfDir );\\n\\t\\tfloat dotBL = dot( material.anisotropyB, lightDir );\\n\\t\\tfloat dotBV = dot( material.anisotropyB, viewDir );\\n\\t\\tfloat dotBH = dot( material.anisotropyB, halfDir );\\n\\t\\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\\n\\t\\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\\n\\t#else\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t#endif\\n\\treturn F * ( V * 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}\\n#if defined( USE_SHEEN )\\nfloat D_Charlie( float roughness, float dotNH ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tfloat invAlpha = 1.0 / alpha;\\n\\tfloat cos2h = dotNH * dotNH;\\n\\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\\n\\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\\n}\\nfloat V_Neubelt( float dotNV, float dotNL ) {\\n\\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\\n}\\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat D = D_Charlie( sheenRoughness, dotNH );\\n\\tfloat V = V_Neubelt( dotNV, dotNL );\\n\\treturn sheenColor * ( D * V );\\n}\\n#endif\\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat r2 = roughness * roughness;\\n\\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\\n\\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\\n\\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\\n\\treturn saturate( DG * RECIPROCAL_PI );\\n}\\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, 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 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\\n\\treturn fab;\\n}\\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\treturn specularColor * fab.x + specularF90 * fab.y;\\n}\\n#ifdef USE_IRIDESCENCE\\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#else\\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#endif\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\\n\\t#else\\n\\t\\tvec3 Fr = specularColor;\\n\\t#endif\\n\\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\\n\\tfloat Ess = fab.x + fab.y;\\n\\tfloat Ems = 1.0 - Ess;\\n\\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\\n\\tsingleScatter += FssEss;\\n\\tmultiScatter += Fms * Ems;\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 normal = geometryNormal;\\n\\t\\tvec3 viewDir = geometryViewDir;\\n\\t\\tvec3 position = geometryPosition;\\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.roughness;\\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 vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\\n\\t\\tvec3 ccIrradiance = dotNLcc * directLight.color;\\n\\t\\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\\n\\t#endif\\n\\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\\n\\t#endif\\n\\tvec3 singleScattering = vec3( 0.0 );\\n\\tvec3 multiScattering = vec3( 0.0 );\\n\\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\\n\\t#else\\n\\t\\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\\n\\t#endif\\n\\tvec3 totalScattering = singleScattering + multiScattering;\\n\\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\\n\\treflectedLight.indirectSpecular += radiance * singleScattering;\\n\\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\\n\\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\\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\\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\nvar lights_fragment_begin = \"\\nvec3 geometryPosition = - vViewPosition;\\nvec3 geometryNormal = normal;\\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\\nvec3 geometryClearcoatNormal = vec3( 0.0 );\\n#ifdef USE_CLEARCOAT\\n\\tgeometryClearcoatNormal = clearcoatNormal;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\\n\\tif ( material.iridescenceThickness == 0.0 ) {\\n\\t\\tmaterial.iridescence = 0.0;\\n\\t} else {\\n\\t\\tmaterial.iridescence = saturate( material.iridescence );\\n\\t}\\n\\tif ( material.iridescence > 0.0 ) {\\n\\t\\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\\n\\t\\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\\n\\t}\\n#endif\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointLightInfo( pointLight, geometryPosition, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\\n\\t\\tpointLightShadow = pointLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\tvec4 spotColor;\\n\\tvec3 spotLightCoord;\\n\\tbool inSpotLightMap;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\\n\\t\\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\\n\\t\\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\\n\\t\\t#else\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#endif\\n\\t\\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\\n\\t\\t\\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\\n\\t\\t\\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\\n\\t\\t\\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\\n\\t\\t\\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\\n\\t\\t#endif\\n\\t\\t#undef SPOT_LIGHT_MAP_INDEX\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\tspotLightShadow = spotLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalLightInfo( directionalLight, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\\n\\t\\tdirectionalLightShadow = directionalLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 iblIrradiance = vec3( 0.0 );\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#if defined( USE_LIGHT_PROBES )\\n\\t\\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\\n\\t#endif\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\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\nvar lights_fragment_maps = \"#if defined( RE_IndirectDiffuse )\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\t\\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tiblIrradiance += getIBLIrradiance( geometryNormal );\\n\\t#endif\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\\n\\t#else\\n\\t\\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\\n\\t#endif\\n#endif\";\n\nvar lights_fragment_end = \"#if defined( RE_IndirectDiffuse )\\n\\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n#endif\";\n\nvar logdepthbuf_fragment = \"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\\n\\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\\n#endif\";\n\nvar logdepthbuf_pars_fragment = \"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\\n\\tuniform float logDepthBufFC;\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t\\tvarying float vIsPerspective;\\n\\t#else\\n\\t\\tuniform float logDepthBufFC;\\n\\t#endif\\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\\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\\n\\t#else\\n\\t\\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\\n\\t\\t\\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\\n\\t\\t\\tgl_Position.z *= gl_Position.w;\\n\\t\\t}\\n\\t#endif\\n#endif\";\n\nvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\tsampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w );\\n\\t\\n\\t#endif\\n\\tdiffuseColor *= sampledDiffuseColor;\\n#endif\";\n\nvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\";\n\nvar map_particle_fragment = \"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\t#if defined( USE_POINTS_UV )\\n\\t\\tvec2 uv = vUv;\\n\\t#else\\n\\t\\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\\n\\t#endif\\n#endif\\n#ifdef USE_MAP\\n\\tdiffuseColor *= texture2D( map, uv );\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\\n#endif\";\n\nvar map_particle_pars_fragment = \"#if defined( USE_POINTS_UV )\\n\\tvarying vec2 vUv;\\n#else\\n\\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\t\\tuniform mat3 uvTransform;\\n\\t#endif\\n#endif\\n#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\\n\\tmetalnessFactor *= texelMetalness.b;\\n#endif\";\n\nvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\nvar morphcolor_vertex = \"#if defined( USE_MORPHCOLORS ) && defined( MORPHTARGETS_TEXTURE )\\n\\tvColor *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t#if defined( USE_COLOR_ALPHA )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\\n\\t\\t#elif defined( USE_COLOR )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal *= morphTargetBaseInfluence;\\n\\t#ifdef MORPHTARGETS_TEXTURE\\n\\t\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\\n\\t\\t}\\n\\t#else\\n\\t\\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\\n\\t\\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\\n\\t\\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\\n\\t\\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\\n\\t#endif\\n#endif\";\n\nvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\tuniform float morphTargetBaseInfluence;\\n\\t#ifdef MORPHTARGETS_TEXTURE\\n\\t\\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\t\\tuniform sampler2DArray morphTargetsTexture;\\n\\t\\tuniform ivec2 morphTargetsTextureSize;\\n\\t\\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\\n\\t\\t\\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\\n\\t\\t\\tint y = texelIndex / morphTargetsTextureSize.x;\\n\\t\\t\\tint x = texelIndex - y * morphTargetsTextureSize.x;\\n\\t\\t\\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\\n\\t\\t\\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\\n\\t\\t}\\n\\t#else\\n\\t\\t#ifndef USE_MORPHNORMALS\\n\\t\\t\\tuniform float morphTargetInfluences[ 8 ];\\n\\t\\t#else\\n\\t\\t\\tuniform float morphTargetInfluences[ 4 ];\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed *= morphTargetBaseInfluence;\\n\\t#ifdef MORPHTARGETS_TEXTURE\\n\\t\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\\n\\t\\t}\\n\\t#else\\n\\t\\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\\n\\t\\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\\n\\t\\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\\n\\t\\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\\n\\t\\t#ifndef USE_MORPHNORMALS\\n\\t\\t\\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\\n\\t\\t\\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\\n\\t\\t\\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\\n\\t\\t\\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar normal_fragment_begin = \"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\\n#ifdef FLAT_SHADED\\n\\tvec3 fdx = dFdx( vViewPosition );\\n\\tvec3 fdy = dFdy( vViewPosition );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal *= faceDirection;\\n\\t#endif\\n#endif\\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\\n\\t#ifdef USE_TANGENT\\n\\t\\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\\n\\t#else\\n\\t\\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\\n\\t\\t#if defined( USE_NORMALMAP )\\n\\t\\t\\tvNormalMapUv\\n\\t\\t#elif defined( USE_CLEARCOAT_NORMALMAP )\\n\\t\\t\\tvClearcoatNormalMapUv\\n\\t\\t#else\\n\\t\\t\\tvUv\\n\\t\\t#endif\\n\\t\\t);\\n\\t#endif\\n\\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\\n\\t\\ttbn[0] *= faceDirection;\\n\\t\\ttbn[1] *= faceDirection;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\t#ifdef USE_TANGENT\\n\\t\\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\\n\\t#else\\n\\t\\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\\n\\t#endif\\n\\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\\n\\t\\ttbn2[0] *= faceDirection;\\n\\t\\ttbn2[1] *= faceDirection;\\n\\t#endif\\n#endif\\nvec3 nonPerturbedNormal = normal;\";\n\nvar normal_fragment_maps = \"#ifdef USE_NORMALMAP_OBJECTSPACE\\n\\tnormal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\\n\\t#ifdef FLIP_SIDED\\n\\t\\tnormal = - normal;\\n\\t#endif\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * faceDirection;\\n\\t#endif\\n\\tnormal = normalize( normalMatrix * normal );\\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\\n\\tmapN.xy *= normalScale;\\n\\tnormal = normalize( tbn * mapN );\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\\n#endif\";\n\nvar normal_pars_fragment = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_pars_vertex = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_vertex = \"#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n\\t#ifdef USE_TANGENT\\n\\t\\tvTangent = normalize( transformedTangent );\\n\\t\\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\\n\\t#endif\\n#endif\";\n\nvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n#endif\\n#ifdef USE_NORMALMAP_OBJECTSPACE\\n\\tuniform mat3 normalMatrix;\\n#endif\\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\\n\\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\\n\\t\\tvec3 q0 = dFdx( eye_pos.xyz );\\n\\t\\tvec3 q1 = dFdy( eye_pos.xyz );\\n\\t\\tvec2 st0 = dFdx( uv.st );\\n\\t\\tvec2 st1 = dFdy( uv.st );\\n\\t\\tvec3 N = surf_norm;\\n\\t\\tvec3 q1perp = cross( q1, N );\\n\\t\\tvec3 q0perp = cross( N, q0 );\\n\\t\\tvec3 T = q1perp * st0.x + q0perp * st1.x;\\n\\t\\tvec3 B = q1perp * st0.y + q0perp * st1.y;\\n\\t\\tfloat det = max( dot( T, T ), dot( B, B ) );\\n\\t\\tfloat scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det );\\n\\t\\treturn mat3( T * scale, B * scale, N );\\n\\t}\\n#endif\";\n\nvar clearcoat_normal_fragment_begin = \"#ifdef USE_CLEARCOAT\\n\\tvec3 clearcoatNormal = nonPerturbedNormal;\\n#endif\";\n\nvar clearcoat_normal_fragment_maps = \"#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\\n\\tclearcoatMapN.xy *= clearcoatNormalScale;\\n\\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\\n#endif\";\n\nvar clearcoat_pars_fragment = \"#ifdef USE_CLEARCOATMAP\\n\\tuniform sampler2D clearcoatMap;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform sampler2D clearcoatNormalMap;\\n\\tuniform vec2 clearcoatNormalScale;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform sampler2D clearcoatRoughnessMap;\\n#endif\";\n\nvar iridescence_pars_fragment = \"#ifdef USE_IRIDESCENCEMAP\\n\\tuniform sampler2D iridescenceMap;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform sampler2D iridescenceThicknessMap;\\n#endif\";\n\nvar opaque_fragment = \"#ifdef OPAQUE\\ndiffuseColor.a = 1.0;\\n#endif\\n#ifdef USE_TRANSMISSION\\ndiffuseColor.a *= material.transmissionAlpha;\\n#endif\\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\";\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}\\nvec2 packDepthToRG( in highp float v ) {\\n\\treturn packDepthToRGBA( v ).yx;\\n}\\nfloat unpackRGToDepth( const in highp vec2 v ) {\\n\\treturn unpackRGBAToDepth( vec4( v.xy, 0.0, 0.0 ) );\\n}\\nvec4 pack2HalfToRGBA( vec2 v ) {\\n\\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\\n\\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\\n}\\nvec2 unpackRGBATo2Half( vec4 v ) {\\n\\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\\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 depth, const in float near, const in float far ) {\\n\\treturn depth * ( 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 depth, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * depth - far );\\n}\";\n\nvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\";\n\nvar project_vertex = \"vec4 mvPosition = vec4( transformed, 1.0 );\\n#ifdef USE_INSTANCING\\n\\tmvPosition = instanceMatrix * mvPosition;\\n#endif\\nmvPosition = modelViewMatrix * mvPosition;\\ngl_Position = projectionMatrix * mvPosition;\";\n\nvar dithering_fragment = \"#ifdef DITHERING\\n\\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\";\n\nvar dithering_pars_fragment = \"#ifdef 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\nvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\\n\\troughnessFactor *= texelRoughness.g;\\n#endif\";\n\nvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\nvar shadowmap_pars_fragment = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n\\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#if NUM_SPOT_LIGHT_MAPS > 0\\n\\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\\n#endif\\n#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\\n\\t}\\n\\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\\n\\t\\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\\n\\t}\\n\\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\\n\\t\\tfloat occlusion = 1.0;\\n\\t\\tvec2 distribution = texture2DDistribution( shadow, uv );\\n\\t\\tfloat hard_shadow = step( compare , distribution.x );\\n\\t\\tif (hard_shadow != 1.0 ) {\\n\\t\\t\\tfloat distance = compare - distribution.x ;\\n\\t\\t\\tfloat variance = max( 0.00000, distribution.y * distribution.y );\\n\\t\\t\\tfloat softness_probability = variance / (variance + distance * distance );\\t\\t\\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\\t\\t\\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\\n\\t\\t}\\n\\t\\treturn occlusion;\\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\\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\\n\\t\\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\\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\\tfloat dx2 = dx0 / 2.0;\\n\\t\\t\\tfloat dy2 = dy0 / 2.0;\\n\\t\\t\\tfloat dx3 = dx1 / 2.0;\\n\\t\\t\\tfloat dy3 = dy1 / 2.0;\\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( dx2, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), 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( dx2, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), 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 / 17.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx = texelSize.x;\\n\\t\\t\\tfloat dy = texelSize.y;\\n\\t\\t\\tvec2 uv = shadowCoord.xy;\\n\\t\\t\\tvec2 f = fract( uv * shadowMapSize + 0.5 );\\n\\t\\t\\tuv -= f * texelSize;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t f.x ),\\n\\t\\t\\t\\t\\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t f.x ),\\n\\t\\t\\t\\t\\t f.y )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\\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 ) || defined( SHADOWMAP_TYPE_VSM )\\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\nvar shadowmap_pars_vertex = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n\\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\\n\\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n#endif\";\n\nvar shadowmap_vertex = \"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\\n\\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\tvec4 shadowWorldPosition;\\n#endif\\n#if defined( USE_SHADOWMAP )\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if NUM_SPOT_LIGHT_COORDS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition;\\n\\t\\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t\\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\\n\\t\\t#endif\\n\\t\\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\";\n\nvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tspotLight = spotLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tpointLight = pointLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\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\\tuniform highp sampler2D boneTexture;\\n\\tuniform int boneTextureSize;\\n\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\tfloat j = i * 4.0;\\n\\t\\tfloat x = mod( j, float( boneTextureSize ) );\\n\\t\\tfloat y = floor( j / float( boneTextureSize ) );\\n\\t\\tfloat dx = 1.0 / float( boneTextureSize );\\n\\t\\tfloat dy = 1.0 / float( boneTextureSize );\\n\\t\\ty = dy * ( y + 0.5 );\\n\\t\\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\\n\\t\\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\\n\\t\\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\\n\\t\\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\\n\\t\\tmat4 bone = mat4( v1, v2, v3, v4 );\\n\\t\\treturn bone;\\n\\t}\\n#endif\";\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\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\\t#ifdef USE_TANGENT\\n\\t\\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#endif\\n#endif\";\n\nvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\\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\\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\";\n\nvar tonemapping_pars_fragment = \"#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\nuniform float toneMappingExposure;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn saturate( toneMappingExposure * color );\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\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}\\nvec3 RRTAndODTFit( vec3 v ) {\\n\\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\\n\\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\\n\\treturn a / b;\\n}\\nvec3 ACESFilmicToneMapping( vec3 color ) {\\n\\tconst mat3 ACESInputMat = mat3(\\n\\t\\tvec3( 0.59719, 0.07600, 0.02840 ),\\t\\tvec3( 0.35458, 0.90834, 0.13383 ),\\n\\t\\tvec3( 0.04823, 0.01566, 0.83777 )\\n\\t);\\n\\tconst mat3 ACESOutputMat = mat3(\\n\\t\\tvec3( 1.60475, -0.10208, -0.00327 ),\\t\\tvec3( -0.53108, 1.10813, -0.07276 ),\\n\\t\\tvec3( -0.07367, -0.00605, 1.07602 )\\n\\t);\\n\\tcolor *= toneMappingExposure / 0.6;\\n\\tcolor = ACESInputMat * color;\\n\\tcolor = RRTAndODTFit( color );\\n\\tcolor = ACESOutputMat * color;\\n\\treturn saturate( color );\\n}\\nvec3 CustomToneMapping( vec3 color ) { return color; }\";\n\nvar transmission_fragment = \"#ifdef USE_TRANSMISSION\\n\\tmaterial.transmission = transmission;\\n\\tmaterial.transmissionAlpha = 1.0;\\n\\tmaterial.thickness = thickness;\\n\\tmaterial.attenuationDistance = attenuationDistance;\\n\\tmaterial.attenuationColor = attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\\n\\t#endif\\n\\tvec3 pos = vWorldPosition;\\n\\tvec3 v = normalize( cameraPosition - pos );\\n\\tvec3 n = inverseTransformDirection( normal, viewMatrix );\\n\\tvec4 transmitted = getIBLVolumeRefraction(\\n\\t\\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\\n\\t\\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness,\\n\\t\\tmaterial.attenuationColor, material.attenuationDistance );\\n\\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\\n\\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\\n#endif\";\n\nvar transmission_pars_fragment = \"#ifdef USE_TRANSMISSION\\n\\tuniform float transmission;\\n\\tuniform float thickness;\\n\\tuniform float attenuationDistance;\\n\\tuniform vec3 attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tuniform sampler2D transmissionMap;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tuniform sampler2D thicknessMap;\\n\\t#endif\\n\\tuniform vec2 transmissionSamplerSize;\\n\\tuniform sampler2D transmissionSamplerMap;\\n\\tuniform mat4 modelMatrix;\\n\\tuniform mat4 projectionMatrix;\\n\\tvarying vec3 vWorldPosition;\\n\\tfloat w0( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\\n\\t}\\n\\tfloat w1( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\\n\\t}\\n\\tfloat w2( float a ){\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\\n\\t}\\n\\tfloat w3( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * a * a );\\n\\t}\\n\\tfloat g0( float a ) {\\n\\t\\treturn w0( a ) + w1( a );\\n\\t}\\n\\tfloat g1( float a ) {\\n\\t\\treturn w2( a ) + w3( a );\\n\\t}\\n\\tfloat h0( float a ) {\\n\\t\\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\\n\\t}\\n\\tfloat h1( float a ) {\\n\\t\\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\\n\\t}\\n\\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\\n\\t\\tuv = uv * texelSize.zw + 0.5;\\n\\t\\tvec2 iuv = floor( uv );\\n\\t\\tvec2 fuv = fract( uv );\\n\\t\\tfloat g0x = g0( fuv.x );\\n\\t\\tfloat g1x = g1( fuv.x );\\n\\t\\tfloat h0x = h0( fuv.x );\\n\\t\\tfloat h1x = h1( fuv.x );\\n\\t\\tfloat h0y = h0( fuv.y );\\n\\t\\tfloat h1y = h1( fuv.y );\\n\\t\\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\\n\\t\\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\\n\\t\\t\\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\\n\\t}\\n\\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\\n\\t\\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\\n\\t\\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\\n\\t\\tvec2 fLodSizeInv = 1.0 / fLodSize;\\n\\t\\tvec2 cLodSizeInv = 1.0 / cLodSize;\\n\\t\\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\\n\\t\\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\\n\\t\\treturn mix( fSample, cSample, fract( lod ) );\\n\\t}\\n\\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\\n\\t\\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\\n\\t\\tvec3 modelScale;\\n\\t\\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\\n\\t\\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\\n\\t\\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\\n\\t\\treturn normalize( refractionVector ) * thickness * modelScale;\\n\\t}\\n\\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\\n\\t\\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\\n\\t}\\n\\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\\n\\t\\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\\n\\t\\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\\n\\t}\\n\\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tif ( isinf( attenuationDistance ) ) {\\n\\t\\t\\treturn vec3( 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\\n\\t\\t\\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\\t\\t\\treturn transmittance;\\n\\t\\t}\\n\\t}\\n\\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\\n\\t\\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\\n\\t\\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\\n\\t\\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\\n\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\trefractionCoords += 1.0;\\n\\t\\trefractionCoords /= 2.0;\\n\\t\\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\\n\\t\\tvec3 transmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\\n\\t\\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\\n\\t\\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\\n\\t\\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\\n\\t\\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\\n\\t}\\n#endif\";\n\nvar uv_pars_fragment = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvarying vec2 vUv;\\n#endif\\n#ifdef USE_MAP\\n\\tvarying vec2 vMapUv;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tvarying vec2 vAlphaMapUv;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tvarying vec2 vLightMapUv;\\n#endif\\n#ifdef USE_AOMAP\\n\\tvarying vec2 vAoMapUv;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tvarying vec2 vBumpMapUv;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tvarying vec2 vNormalMapUv;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tvarying vec2 vEmissiveMapUv;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tvarying vec2 vMetalnessMapUv;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tvarying vec2 vRoughnessMapUv;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tvarying vec2 vAnisotropyMapUv;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tvarying vec2 vClearcoatMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvarying vec2 vClearcoatNormalMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tvarying vec2 vClearcoatRoughnessMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tvarying vec2 vIridescenceMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tvarying vec2 vIridescenceThicknessMapUv;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tvarying vec2 vSheenColorMapUv;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tvarying vec2 vSheenRoughnessMapUv;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tvarying vec2 vSpecularMapUv;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tvarying vec2 vSpecularColorMapUv;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tvarying vec2 vSpecularIntensityMapUv;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tuniform mat3 transmissionMapTransform;\\n\\tvarying vec2 vTransmissionMapUv;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tuniform mat3 thicknessMapTransform;\\n\\tvarying vec2 vThicknessMapUv;\\n#endif\";\n\nvar uv_pars_vertex = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvarying vec2 vUv;\\n#endif\\n#ifdef USE_MAP\\n\\tuniform mat3 mapTransform;\\n\\tvarying vec2 vMapUv;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform mat3 alphaMapTransform;\\n\\tvarying vec2 vAlphaMapUv;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tuniform mat3 lightMapTransform;\\n\\tvarying vec2 vLightMapUv;\\n#endif\\n#ifdef USE_AOMAP\\n\\tuniform mat3 aoMapTransform;\\n\\tvarying vec2 vAoMapUv;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tuniform mat3 bumpMapTransform;\\n\\tvarying vec2 vBumpMapUv;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tuniform mat3 normalMapTransform;\\n\\tvarying vec2 vNormalMapUv;\\n#endif\\n#ifdef USE_DISPLACEMENTMAP\\n\\tuniform mat3 displacementMapTransform;\\n\\tvarying vec2 vDisplacementMapUv;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tuniform mat3 emissiveMapTransform;\\n\\tvarying vec2 vEmissiveMapUv;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tuniform mat3 metalnessMapTransform;\\n\\tvarying vec2 vMetalnessMapUv;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tuniform mat3 roughnessMapTransform;\\n\\tvarying vec2 vRoughnessMapUv;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tuniform mat3 anisotropyMapTransform;\\n\\tvarying vec2 vAnisotropyMapUv;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tuniform mat3 clearcoatMapTransform;\\n\\tvarying vec2 vClearcoatMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform mat3 clearcoatNormalMapTransform;\\n\\tvarying vec2 vClearcoatNormalMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform mat3 clearcoatRoughnessMapTransform;\\n\\tvarying vec2 vClearcoatRoughnessMapUv;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tuniform mat3 sheenColorMapTransform;\\n\\tvarying vec2 vSheenColorMapUv;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tuniform mat3 sheenRoughnessMapTransform;\\n\\tvarying vec2 vSheenRoughnessMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tuniform mat3 iridescenceMapTransform;\\n\\tvarying vec2 vIridescenceMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform mat3 iridescenceThicknessMapTransform;\\n\\tvarying vec2 vIridescenceThicknessMapUv;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tuniform mat3 specularMapTransform;\\n\\tvarying vec2 vSpecularMapUv;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tuniform mat3 specularColorMapTransform;\\n\\tvarying vec2 vSpecularColorMapUv;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tuniform mat3 specularIntensityMapTransform;\\n\\tvarying vec2 vSpecularIntensityMapUv;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tuniform mat3 transmissionMapTransform;\\n\\tvarying vec2 vTransmissionMapUv;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tuniform mat3 thicknessMapTransform;\\n\\tvarying vec2 vThicknessMapUv;\\n#endif\";\n\nvar uv_vertex = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvUv = vec3( uv, 1 ).xy;\\n#endif\\n#ifdef USE_MAP\\n\\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_AOMAP\\n\\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_DISPLACEMENTMAP\\n\\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\\n#endif\";\n\nvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\\n\\tvec4 worldPosition = vec4( transformed, 1.0 );\\n\\t#ifdef USE_INSTANCING\\n\\t\\tworldPosition = instanceMatrix * worldPosition;\\n\\t#endif\\n\\tworldPosition = modelMatrix * worldPosition;\\n#endif\";\n\nconst vertex$h = \"varying vec2 vUv;\\nuniform mat3 uvTransform;\\nvoid main() {\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\tgl_Position = vec4( position.xy, 1.0, 1.0 );\\n}\";\n\nconst fragment$h = \"uniform sampler2D t2D;\\nuniform float backgroundIntensity;\\nvarying vec2 vUv;\\nvoid main() {\\n\\tvec4 texColor = texture2D( t2D, vUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\\n\\t#endif\\n\\ttexColor.rgb *= backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n}\";\n\nconst vertex$g = \"varying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$g = \"#ifdef ENVMAP_TYPE_CUBE\\n\\tuniform samplerCube envMap;\\n#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\tuniform sampler2D envMap;\\n#endif\\nuniform float flipEnvMap;\\nuniform float backgroundBlurriness;\\nuniform float backgroundIntensity;\\nvarying vec3 vWorldDirection;\\n#include <cube_uv_reflection_fragment>\\nvoid main() {\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 texColor = textureCube( envMap, vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tvec4 texColor = textureCubeUV( envMap, vWorldDirection, backgroundBlurriness );\\n\\t#else\\n\\t\\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\\n\\t#endif\\n\\ttexColor.rgb *= backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n}\";\n\nconst vertex$f = \"varying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$f = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldDirection;\\nvoid main() {\\n\\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\\n\\tgl_FragColor = texColor;\\n\\tgl_FragColor.a *= opacity;\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n}\";\n\nconst vertex$e = \"#include <common>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvHighPrecisionZW = gl_Position.zw;\\n}\";\n\nconst fragment$e = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include <common>\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( fragCoordZ );\\n\\t#endif\\n}\";\n\nconst vertex$d = \"#define DISTANCE\\nvarying vec3 vWorldPosition;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvWorldPosition = worldPosition.xyz;\\n}\";\n\nconst fragment$d = \"#define DISTANCE\\nuniform vec3 referencePosition;\\nuniform float nearDistance;\\nuniform float farDistance;\\nvarying vec3 vWorldPosition;\\n#include <common>\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main () {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\tfloat dist = length( vWorldPosition - referencePosition );\\n\\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\\n\\tdist = saturate( dist );\\n\\tgl_FragColor = packDepthToRGBA( dist );\\n}\";\n\nconst vertex$c = \"varying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n}\";\n\nconst fragment$c = \"uniform sampler2D tEquirect;\\nvarying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvec3 direction = normalize( vWorldDirection );\\n\\tvec2 sampleUV = equirectUv( direction );\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n}\";\n\nconst vertex$b = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\tvLineDistance = scale * lineDistance;\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$b = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include <common>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\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 <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n}\";\n\nconst vertex$a = \"#include <common>\\n#include <uv_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinbase_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t\\t#include <defaultnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$a = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <common>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <specularmap_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include <aomap_fragment>\\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include <envmap_fragment>\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$9 = \"#define LAMBERT\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$9 = \"#define LAMBERT\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_lambert_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\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 <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <specularmap_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_lambert_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include <envmap_fragment>\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$8 = \"#define MATCAP\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <color_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <fog_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n}\";\n\nconst fragment$8 = \"#define MATCAP\\nuniform vec3 diffuse;\\nuniform float opacity;\\nuniform sampler2D matcap;\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <normal_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\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\\t#ifdef USE_MATCAP\\n\\t\\tvec4 matcapColor = texture2D( matcap, uv );\\n\\t#else\\n\\t\\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\\n\\t#endif\\n\\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$7 = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$7 = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <normal_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\\n\\t#ifdef OPAQUE\\n\\t\\tgl_FragColor.a = 1.0;\\n\\t#endif\\n}\";\n\nconst vertex$6 = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$6 = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_phong_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\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 <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <specularmap_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_phong_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include <envmap_fragment>\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$5 = \"#define STANDARD\\nvarying vec3 vViewPosition;\\n#ifdef USE_TRANSMISSION\\n\\tvarying vec3 vWorldPosition;\\n#endif\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n#ifdef USE_TRANSMISSION\\n\\tvWorldPosition = worldPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$5 = \"#define STANDARD\\n#ifdef PHYSICAL\\n\\t#define IOR\\n\\t#define USE_SPECULAR\\n#endif\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifdef IOR\\n\\tuniform float ior;\\n#endif\\n#ifdef USE_SPECULAR\\n\\tuniform float specularIntensity;\\n\\tuniform vec3 specularColor;\\n\\t#ifdef USE_SPECULAR_COLORMAP\\n\\t\\tuniform sampler2D specularColorMap;\\n\\t#endif\\n\\t#ifdef USE_SPECULAR_INTENSITYMAP\\n\\t\\tuniform sampler2D specularIntensityMap;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tuniform float clearcoat;\\n\\tuniform float clearcoatRoughness;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tuniform float iridescence;\\n\\tuniform float iridescenceIOR;\\n\\tuniform float iridescenceThicknessMinimum;\\n\\tuniform float iridescenceThicknessMaximum;\\n#endif\\n#ifdef USE_SHEEN\\n\\tuniform vec3 sheenColor;\\n\\tuniform float sheenRoughness;\\n\\t#ifdef USE_SHEEN_COLORMAP\\n\\t\\tuniform sampler2D sheenColorMap;\\n\\t#endif\\n\\t#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\t\\tuniform sampler2D sheenRoughnessMap;\\n\\t#endif\\n#endif\\n#ifdef USE_ANISOTROPY\\n\\tuniform vec2 anisotropyVector;\\n\\t#ifdef USE_ANISOTROPYMAP\\n\\t\\tuniform sampler2D anisotropyMap;\\n\\t#endif\\n#endif\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <iridescence_fragment>\\n#include <cube_uv_reflection_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_physical_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_physical_pars_fragment>\\n#include <transmission_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <clearcoat_pars_fragment>\\n#include <iridescence_pars_fragment>\\n#include <roughnessmap_pars_fragment>\\n#include <metalnessmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\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 <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <roughnessmap_fragment>\\n\\t#include <metalnessmap_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <clearcoat_normal_fragment_begin>\\n\\t#include <clearcoat_normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_physical_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\\n\\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n\\t#include <transmission_fragment>\\n\\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\\n\\t#ifdef USE_SHEEN\\n\\t\\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\\n\\t\\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\\n\\t\\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\\n\\t\\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\\n\\t#endif\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$4 = \"#define TOON\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$4 = \"#define TOON\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <gradientmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_toon_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\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 <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_toon_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$3 = \"uniform float size;\\nuniform float scale;\\n#include <common>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\n#ifdef USE_POINTS_UV\\n\\tvarying vec2 vUv;\\n\\tuniform mat3 uvTransform;\\n#endif\\nvoid main() {\\n\\t#ifdef USE_POINTS_UV\\n\\t\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\t#endif\\n\\t#include <color_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <project_vertex>\\n\\tgl_PointSize = size;\\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\\n\\t#endif\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$3 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include <common>\\n#include <color_pars_fragment>\\n#include <map_particle_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_particle_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n}\";\n\nconst vertex$2 = \"#include <common>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <shadowmap_pars_vertex>\\nvoid main() {\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$2 = \"uniform vec3 color;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <logdepthbuf_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <shadowmask_pars_fragment>\\nvoid main() {\\n\\t#include <logdepthbuf_fragment>\\n\\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n}\";\n\nconst vertex$1 = \"uniform float rotation;\\nuniform vec2 center;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\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 = isPerspectiveMatrix( projectionMatrix );\\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 <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$1 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include <common>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n}\";\n\nconst ShaderChunk = {\n\talphahash_fragment: alphahash_fragment,\n\talphahash_pars_fragment: alphahash_pars_fragment,\n\talphamap_fragment: alphamap_fragment,\n\talphamap_pars_fragment: alphamap_pars_fragment,\n\talphatest_fragment: alphatest_fragment,\n\talphatest_pars_fragment: alphatest_pars_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\tiridescence_fragment: iridescence_fragment,\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\tcolorspace_fragment: colorspace_fragment,\n\tcolorspace_pars_fragment: colorspace_pars_fragment,\n\tenvmap_fragment: envmap_fragment,\n\tenvmap_common_pars_fragment: envmap_common_pars_fragment,\n\tenvmap_pars_fragment: envmap_pars_fragment,\n\tenvmap_pars_vertex: envmap_pars_vertex,\n\tenvmap_physical_pars_fragment: envmap_physical_pars_fragment,\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_fragment: lights_lambert_fragment,\n\tlights_lambert_pars_fragment: lights_lambert_pars_fragment,\n\tlights_pars_begin: lights_pars_begin,\n\tlights_toon_fragment: lights_toon_fragment,\n\tlights_toon_pars_fragment: lights_toon_pars_fragment,\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\tmorphcolor_vertex: morphcolor_vertex,\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\tnormal_pars_fragment: normal_pars_fragment,\n\tnormal_pars_vertex: normal_pars_vertex,\n\tnormal_vertex: normal_vertex,\n\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\tclearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin,\n\tclearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps,\n\tclearcoat_pars_fragment: clearcoat_pars_fragment,\n\tiridescence_pars_fragment: iridescence_pars_fragment,\n\topaque_fragment: opaque_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\ttransmission_fragment: transmission_fragment,\n\ttransmission_pars_fragment: transmission_pars_fragment,\n\tuv_pars_fragment: uv_pars_fragment,\n\tuv_pars_vertex: uv_pars_vertex,\n\tuv_vertex: uv_vertex,\n\tworldpos_vertex: worldpos_vertex,\n\n\tbackground_vert: vertex$h,\n\tbackground_frag: fragment$h,\n\tbackgroundCube_vert: vertex$g,\n\tbackgroundCube_frag: fragment$g,\n\tcube_vert: vertex$f,\n\tcube_frag: fragment$f,\n\tdepth_vert: vertex$e,\n\tdepth_frag: fragment$e,\n\tdistanceRGBA_vert: vertex$d,\n\tdistanceRGBA_frag: fragment$d,\n\tequirect_vert: vertex$c,\n\tequirect_frag: fragment$c,\n\tlinedashed_vert: vertex$b,\n\tlinedashed_frag: fragment$b,\n\tmeshbasic_vert: vertex$a,\n\tmeshbasic_frag: fragment$a,\n\tmeshlambert_vert: vertex$9,\n\tmeshlambert_frag: fragment$9,\n\tmeshmatcap_vert: vertex$8,\n\tmeshmatcap_frag: fragment$8,\n\tmeshnormal_vert: vertex$7,\n\tmeshnormal_frag: fragment$7,\n\tmeshphong_vert: vertex$6,\n\tmeshphong_frag: fragment$6,\n\tmeshphysical_vert: vertex$5,\n\tmeshphysical_frag: fragment$5,\n\tmeshtoon_vert: vertex$4,\n\tmeshtoon_frag: fragment$4,\n\tpoints_vert: vertex$3,\n\tpoints_frag: fragment$3,\n\tshadow_vert: vertex$2,\n\tshadow_frag: fragment$2,\n\tsprite_vert: vertex$1,\n\tsprite_frag: fragment$1\n};\n\n/**\n * Uniforms library for shared webgl shaders\n */\n\nconst UniformsLib = {\n\n\tcommon: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\n\t\tmap: { value: null },\n\t\tmapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaTest: { value: 0 }\n\n\t},\n\n\tspecularmap: {\n\n\t\tspecularMap: { value: null },\n\t\tspecularMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tenvmap: {\n\n\t\tenvMap: { value: null },\n\t\tflipEnvMap: { value: - 1 },\n\t\treflectivity: { value: 1.0 }, // basic, lambert, phong\n\t\tior: { value: 1.5 }, // physical\n\t\trefractionRatio: { value: 0.98 }, // basic, lambert, phong\n\n\t},\n\n\taomap: {\n\n\t\taoMap: { value: null },\n\t\taoMapIntensity: { value: 1 },\n\t\taoMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tlightmap: {\n\n\t\tlightMap: { value: null },\n\t\tlightMapIntensity: { value: 1 },\n\t\tlightMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tbumpmap: {\n\n\t\tbumpMap: { value: null },\n\t\tbumpMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tbumpScale: { value: 1 }\n\n\t},\n\n\tnormalmap: {\n\n\t\tnormalMap: { value: null },\n\t\tnormalMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tnormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) }\n\n\t},\n\n\tdisplacementmap: {\n\n\t\tdisplacementMap: { value: null },\n\t\tdisplacementMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tdisplacementScale: { value: 1 },\n\t\tdisplacementBias: { value: 0 }\n\n\t},\n\n\temissivemap: {\n\n\t\temissiveMap: { value: null },\n\t\temissiveMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tmetalnessmap: {\n\n\t\tmetalnessMap: { value: null },\n\t\tmetalnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\troughnessmap: {\n\n\t\troughnessMap: { value: null },\n\t\troughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }\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: /*@__PURE__*/ new Color( 0xffffff ) }\n\n\t},\n\n\tlights: {\n\n\t\tambientLightColor: { value: [] },\n\n\t\tlightProbe: { value: [] },\n\n\t\tdirectionalLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tcolor: {}\n\t\t} },\n\n\t\tdirectionalLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\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\t\t} },\n\n\t\tspotLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tspotLightMap: { value: [] },\n\t\tspotShadowMap: { value: [] },\n\t\tspotLightMatrix: { value: [] },\n\n\t\tpointLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdecay: {},\n\t\t\tdistance: {}\n\t\t} },\n\n\t\tpointLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\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\tltc_1: { value: null },\n\t\tltc_2: { value: null }\n\n\t},\n\n\tpoints: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\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\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tsprite: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tcenter: { value: /*@__PURE__*/ new Vector2( 0.5, 0.5 ) },\n\t\trotation: { value: 0.0 },\n\t\tmap: { value: null },\n\t\tmapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaTest: { value: 0 }\n\n\t}\n\n};\n\nconst ShaderLib = {\n\n\tbasic: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\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: /*@__PURE__*/ mergeUniforms( [\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.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ 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: /*@__PURE__*/ mergeUniforms( [\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.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\tspecular: { value: /*@__PURE__*/ 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: /*@__PURE__*/ mergeUniforms( [\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: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\troughness: { value: 1.0 },\n\t\t\t\tmetalness: { value: 0.0 },\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\ttoon: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\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: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshtoon_vert,\n\t\tfragmentShader: ShaderChunk.meshtoon_frag\n\n\t},\n\n\tmatcap: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tmatcap: { value: null }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshmatcap_vert,\n\t\tfragmentShader: ShaderChunk.meshmatcap_frag\n\n\t},\n\n\tpoints: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\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: /*@__PURE__*/ mergeUniforms( [\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: /*@__PURE__*/ mergeUniforms( [\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: /*@__PURE__*/ mergeUniforms( [\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.meshnormal_vert,\n\t\tfragmentShader: ShaderChunk.meshnormal_frag\n\n\t},\n\n\tsprite: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.sprite,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.sprite_vert,\n\t\tfragmentShader: ShaderChunk.sprite_frag\n\n\t},\n\n\tbackground: {\n\n\t\tuniforms: {\n\t\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tt2D: { value: null },\n\t\t\tbackgroundIntensity: { value: 1 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.background_vert,\n\t\tfragmentShader: ShaderChunk.background_frag\n\n\t},\n\n\tbackgroundCube: {\n\n\t\tuniforms: {\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: - 1 },\n\t\t\tbackgroundBlurriness: { value: 0 },\n\t\t\tbackgroundIntensity: { value: 1 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.backgroundCube_vert,\n\t\tfragmentShader: ShaderChunk.backgroundCube_frag\n\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: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\treferencePosition: { value: /*@__PURE__*/ 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: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.lights,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tcolor: { value: /*@__PURE__*/ 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: /*@__PURE__*/ mergeUniforms( [\n\t\tShaderLib.standard.uniforms,\n\t\t{\n\t\t\tclearcoat: { value: 0 },\n\t\t\tclearcoatMap: { value: null },\n\t\t\tclearcoatMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tclearcoatNormalMap: { value: null },\n\t\t\tclearcoatNormalMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tclearcoatNormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) },\n\t\t\tclearcoatRoughness: { value: 0 },\n\t\t\tclearcoatRoughnessMap: { value: null },\n\t\t\tclearcoatRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tiridescence: { value: 0 },\n\t\t\tiridescenceMap: { value: null },\n\t\t\tiridescenceMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tiridescenceIOR: { value: 1.3 },\n\t\t\tiridescenceThicknessMinimum: { value: 100 },\n\t\t\tiridescenceThicknessMaximum: { value: 400 },\n\t\t\tiridescenceThicknessMap: { value: null },\n\t\t\tiridescenceThicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tsheen: { value: 0 },\n\t\t\tsheenColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tsheenColorMap: { value: null },\n\t\t\tsheenColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tsheenRoughness: { value: 1 },\n\t\t\tsheenRoughnessMap: { value: null },\n\t\t\tsheenRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\ttransmission: { value: 0 },\n\t\t\ttransmissionMap: { value: null },\n\t\t\ttransmissionMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\ttransmissionSamplerSize: { value: /*@__PURE__*/ new Vector2() },\n\t\t\ttransmissionSamplerMap: { value: null },\n\t\t\tthickness: { value: 0 },\n\t\t\tthicknessMap: { value: null },\n\t\t\tthicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tattenuationDistance: { value: 0 },\n\t\t\tattenuationColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tspecularColor: { value: /*@__PURE__*/ new Color( 1, 1, 1 ) },\n\t\t\tspecularColorMap: { value: null },\n\t\t\tspecularColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tspecularIntensity: { value: 1 },\n\t\t\tspecularIntensityMap: { value: null },\n\t\t\tspecularIntensityMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tanisotropyVector: { value: /*@__PURE__*/ new Vector2() },\n\t\t\tanisotropyMap: { value: null },\n\t\t\tanisotropyMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t}\n\t] ),\n\n\tvertexShader: ShaderChunk.meshphysical_vert,\n\tfragmentShader: ShaderChunk.meshphysical_frag\n\n};\n\nconst _rgb = { r: 0, b: 0, g: 0 };\n\nfunction WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha, premultipliedAlpha ) {\n\n\tconst clearColor = new Color( 0x000000 );\n\tlet clearAlpha = alpha === true ? 0 : 1;\n\n\tlet planeMesh;\n\tlet boxMesh;\n\n\tlet currentBackground = null;\n\tlet currentBackgroundVersion = 0;\n\tlet currentTonemapping = null;\n\n\tfunction render( renderList, scene ) {\n\n\t\tlet forceClear = false;\n\t\tlet background = scene.isScene === true ? scene.background : null;\n\n\t\tif ( background && background.isTexture ) {\n\n\t\t\tconst usePMREM = scene.backgroundBlurriness > 0; // use PMREM if the user wants to blur the background\n\t\t\tbackground = ( usePMREM ? cubeuvmaps : cubemaps ).get( background );\n\n\t\t}\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\tconst environmentBlendMode = renderer.xr.getEnvironmentBlendMode();\n\n\t\tif ( environmentBlendMode === 'additive' ) {\n\n\t\t\tstate.buffers.color.setClear( 0, 0, 0, 1, premultipliedAlpha );\n\n\t\t} else if ( environmentBlendMode === 'alpha-blend' ) {\n\n\t\t\tstate.buffers.color.setClear( 0, 0, 0, 0, premultipliedAlpha );\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 || background.mapping === CubeUVReflectionMapping ) ) {\n\n\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\tnew BoxGeometry( 1, 1, 1 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundCubeMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.backgroundCube.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.backgroundCube.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.backgroundCube.fragmentShader,\n\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\tdepthTest: false,\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.deleteAttribute( 'normal' );\n\t\t\t\tboxMesh.geometry.deleteAttribute( '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\t// add \"envMap\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( boxMesh.material, 'envMap', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.envMap.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( boxMesh );\n\n\t\t\t}\n\n\t\t\tboxMesh.material.uniforms.envMap.value = background;\n\t\t\tboxMesh.material.uniforms.flipEnvMap.value = ( background.isCubeTexture && background.isRenderTargetTexture === false ) ? - 1 : 1;\n\t\t\tboxMesh.material.uniforms.backgroundBlurriness.value = scene.backgroundBlurriness;\n\t\t\tboxMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\t\t\tboxMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer;\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tboxMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tboxMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );\n\n\t\t} else if ( background && background.isTexture ) {\n\n\t\t\tif ( planeMesh === undefined ) {\n\n\t\t\t\tplaneMesh = new Mesh(\n\t\t\t\t\tnew PlaneGeometry( 2, 2 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.background.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.background.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.background.fragmentShader,\n\t\t\t\t\t\tside: FrontSide,\n\t\t\t\t\t\tdepthTest: false,\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\tplaneMesh.geometry.deleteAttribute( 'normal' );\n\n\t\t\t\t// add \"map\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( planeMesh.material, 'map', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.t2D.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( planeMesh );\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.t2D.value = background;\n\t\t\tplaneMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\t\t\tplaneMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer;\n\n\t\t\tif ( background.matrixAutoUpdate === true ) {\n\n\t\t\t\tbackground.updateMatrix();\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.uvTransform.value.copy( background.matrix );\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tplaneMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tplaneMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );\n\n\t\t}\n\n\t}\n\n\tfunction setClear( color, alpha ) {\n\n\t\tcolor.getRGB( _rgb, getUnlitUniformColorSpace( renderer ) );\n\n\t\tstate.buffers.color.setClear( _rgb.r, _rgb.g, _rgb.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 = 1 ) {\n\n\t\t\tclearColor.set( color );\n\t\t\tclearAlpha = alpha;\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\nfunction WebGLBindingStates( gl, extensions, attributes, capabilities ) {\n\n\tconst maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\n\tconst extension = capabilities.isWebGL2 ? null : extensions.get( 'OES_vertex_array_object' );\n\tconst vaoAvailable = capabilities.isWebGL2 || extension !== null;\n\n\tconst bindingStates = {};\n\n\tconst defaultState = createBindingState( null );\n\tlet currentState = defaultState;\n\tlet forceUpdate = false;\n\n\tfunction setup( object, material, program, geometry, index ) {\n\n\t\tlet updateBuffers = false;\n\n\t\tif ( vaoAvailable ) {\n\n\t\t\tconst state = getBindingState( geometry, program, material );\n\n\t\t\tif ( currentState !== state ) {\n\n\t\t\t\tcurrentState = state;\n\t\t\t\tbindVertexArrayObject( currentState.object );\n\n\t\t\t}\n\n\t\t\tupdateBuffers = needsUpdate( object, geometry, program, index );\n\n\t\t\tif ( updateBuffers ) saveCache( object, geometry, program, index );\n\n\t\t} else {\n\n\t\t\tconst wireframe = ( material.wireframe === true );\n\n\t\t\tif ( currentState.geometry !== geometry.id ||\n\t\t\t\tcurrentState.program !== program.id ||\n\t\t\t\tcurrentState.wireframe !== wireframe ) {\n\n\t\t\t\tcurrentState.geometry = geometry.id;\n\t\t\t\tcurrentState.program = program.id;\n\t\t\t\tcurrentState.wireframe = wireframe;\n\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( index !== null ) {\n\n\t\t\tattributes.update( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t}\n\n\t\tif ( updateBuffers || forceUpdate ) {\n\n\t\t\tforceUpdate = false;\n\n\t\t\tsetupVertexAttributes( object, material, program, geometry );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, attributes.get( index ).buffer );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createVertexArrayObject() {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.createVertexArray();\n\n\t\treturn extension.createVertexArrayOES();\n\n\t}\n\n\tfunction bindVertexArrayObject( vao ) {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.bindVertexArray( vao );\n\n\t\treturn extension.bindVertexArrayOES( vao );\n\n\t}\n\n\tfunction deleteVertexArrayObject( vao ) {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.deleteVertexArray( vao );\n\n\t\treturn extension.deleteVertexArrayOES( vao );\n\n\t}\n\n\tfunction getBindingState( geometry, program, material ) {\n\n\t\tconst wireframe = ( material.wireframe === true );\n\n\t\tlet programMap = bindingStates[ geometry.id ];\n\n\t\tif ( programMap === undefined ) {\n\n\t\t\tprogramMap = {};\n\t\t\tbindingStates[ geometry.id ] = programMap;\n\n\t\t}\n\n\t\tlet stateMap = programMap[ program.id ];\n\n\t\tif ( stateMap === undefined ) {\n\n\t\t\tstateMap = {};\n\t\t\tprogramMap[ program.id ] = stateMap;\n\n\t\t}\n\n\t\tlet state = stateMap[ wireframe ];\n\n\t\tif ( state === undefined ) {\n\n\t\t\tstate = createBindingState( createVertexArrayObject() );\n\t\t\tstateMap[ wireframe ] = state;\n\n\t\t}\n\n\t\treturn state;\n\n\t}\n\n\tfunction createBindingState( vao ) {\n\n\t\tconst newAttributes = [];\n\t\tconst enabledAttributes = [];\n\t\tconst attributeDivisors = [];\n\n\t\tfor ( let i = 0; i < maxVertexAttributes; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\t\t\tenabledAttributes[ i ] = 0;\n\t\t\tattributeDivisors[ i ] = 0;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\t// for backward compatibility on non-VAO support browser\n\t\t\tgeometry: null,\n\t\t\tprogram: null,\n\t\t\twireframe: false,\n\n\t\t\tnewAttributes: newAttributes,\n\t\t\tenabledAttributes: enabledAttributes,\n\t\t\tattributeDivisors: attributeDivisors,\n\t\t\tobject: vao,\n\t\t\tattributes: {},\n\t\t\tindex: null\n\n\t\t};\n\n\t}\n\n\tfunction needsUpdate( object, geometry, program, index ) {\n\n\t\tconst cachedAttributes = currentState.attributes;\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tconst cachedAttribute = cachedAttributes[ name ];\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( cachedAttribute === undefined ) return true;\n\n\t\t\t\tif ( cachedAttribute.attribute !== geometryAttribute ) return true;\n\n\t\t\t\tif ( geometryAttribute && cachedAttribute.data !== geometryAttribute.data ) return true;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( currentState.attributesNum !== attributesNum ) return true;\n\n\t\tif ( currentState.index !== index ) return true;\n\n\t\treturn false;\n\n\t}\n\n\tfunction saveCache( object, geometry, program, index ) {\n\n\t\tconst cache = {};\n\t\tconst attributes = geometry.attributes;\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet attribute = attributes[ name ];\n\n\t\t\t\tif ( attribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) attribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) attribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tconst data = {};\n\t\t\t\tdata.attribute = attribute;\n\n\t\t\t\tif ( attribute && attribute.data ) {\n\n\t\t\t\t\tdata.data = attribute.data;\n\n\t\t\t\t}\n\n\t\t\t\tcache[ name ] = data;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcurrentState.attributes = cache;\n\t\tcurrentState.attributesNum = attributesNum;\n\n\t\tcurrentState.index = index;\n\n\t}\n\n\tfunction initAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\n\t\tfor ( let i = 0, il = newAttributes.length; i < il; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\tfunction enableAttribute( attribute ) {\n\n\t\tenableAttributeAndDivisor( attribute, 0 );\n\n\t}\n\n\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute ) {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\t\tconst attributeDivisors = currentState.attributeDivisors;\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\tconst extension = capabilities.isWebGL2 ? gl : extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\textension[ capabilities.isWebGL2 ? 'vertexAttribDivisor' : 'vertexAttribDivisorANGLE' ]( attribute, meshPerAttribute );\n\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t}\n\n\t}\n\n\tfunction disableUnusedAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\n\t\tfor ( let i = 0, il = enabledAttributes.length; i < il; 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 vertexAttribPointer( index, size, type, normalized, stride, offset, integer ) {\n\n\t\tif ( integer === true ) {\n\n\t\t\tgl.vertexAttribIPointer( index, size, type, stride, offset );\n\n\t\t} else {\n\n\t\t\tgl.vertexAttribPointer( index, size, type, normalized, stride, offset );\n\n\t\t}\n\n\t}\n\n\tfunction setupVertexAttributes( object, material, program, geometry ) {\n\n\t\tif ( capabilities.isWebGL2 === false && ( object.isInstancedMesh || geometry.isInstancedBufferGeometry ) ) {\n\n\t\t\tif ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) return;\n\n\t\t}\n\n\t\tinitAttributes();\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tconst materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\tconst normalized = geometryAttribute.normalized;\n\t\t\t\t\tconst size = geometryAttribute.itemSize;\n\n\t\t\t\t\tconst 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\tconst buffer = attribute.buffer;\n\t\t\t\t\tconst type = attribute.type;\n\t\t\t\t\tconst bytesPerElement = attribute.bytesPerElement;\n\n\t\t\t\t\t// check for integer attributes (WebGL 2 only)\n\n\t\t\t\t\tconst integer = ( capabilities.isWebGL2 === true && ( type === gl.INT || type === gl.UNSIGNED_INT || geometryAttribute.gpuType === IntType ) );\n\n\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst data = geometryAttribute.data;\n\t\t\t\t\t\tconst stride = data.stride;\n\t\t\t\t\t\tconst offset = geometryAttribute.offset;\n\n\t\t\t\t\t\tif ( data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, data.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = 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\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tstride * bytesPerElement,\n\t\t\t\t\t\t\t\t( offset + ( size / programAttribute.locationSize ) * i ) * bytesPerElement,\n\t\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\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\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, geometryAttribute.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = 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\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tsize * bytesPerElement,\n\t\t\t\t\t\t\t\t( size / programAttribute.locationSize ) * i * bytesPerElement,\n\t\t\t\t\t\t\t\tinteger\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} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\tconst 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\tgl.vertexAttrib2fv( programAttribute.location, 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\tgl.vertexAttrib3fv( programAttribute.location, 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\tgl.vertexAttrib4fv( programAttribute.location, 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\tgl.vertexAttrib1fv( programAttribute.location, 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\tdisableUnusedAttributes();\n\n\t}\n\n\tfunction dispose() {\n\n\t\treset();\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tfor ( const programId in programMap ) {\n\n\t\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t\t}\n\n\t\t\t\tdelete programMap[ programId ];\n\n\t\t\t}\n\n\t\t\tdelete bindingStates[ geometryId ];\n\n\t\t}\n\n\t}\n\n\tfunction releaseStatesOfGeometry( geometry ) {\n\n\t\tif ( bindingStates[ geometry.id ] === undefined ) return;\n\n\t\tconst programMap = bindingStates[ geometry.id ];\n\n\t\tfor ( const programId in programMap ) {\n\n\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ programId ];\n\n\t\t}\n\n\t\tdelete bindingStates[ geometry.id ];\n\n\t}\n\n\tfunction releaseStatesOfProgram( program ) {\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tif ( programMap[ program.id ] === undefined ) continue;\n\n\t\t\tconst stateMap = programMap[ program.id ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ program.id ];\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\tresetDefaultState();\n\t\tforceUpdate = true;\n\n\t\tif ( currentState === defaultState ) return;\n\n\t\tcurrentState = defaultState;\n\t\tbindVertexArrayObject( currentState.object );\n\n\t}\n\n\t// for backward-compatibility\n\n\tfunction resetDefaultState() {\n\n\t\tdefaultState.geometry = null;\n\t\tdefaultState.program = null;\n\t\tdefaultState.wireframe = false;\n\n\t}\n\n\treturn {\n\n\t\tsetup: setup,\n\t\treset: reset,\n\t\tresetDefaultState: resetDefaultState,\n\t\tdispose: dispose,\n\t\treleaseStatesOfGeometry: releaseStatesOfGeometry,\n\t\treleaseStatesOfProgram: releaseStatesOfProgram,\n\n\t\tinitAttributes: initAttributes,\n\t\tenableAttribute: enableAttribute,\n\t\tdisableUnusedAttributes: disableUnusedAttributes\n\n\t};\n\n}\n\nfunction WebGLBufferRenderer( gl, extensions, info, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tlet 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, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tlet extension, methodName;\n\n\t\tif ( isWebGL2 ) {\n\n\t\t\textension = gl;\n\t\t\tmethodName = 'drawArraysInstanced';\n\n\t\t} else {\n\n\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\t\t\tmethodName = 'drawArraysInstancedANGLE';\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: 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\textension[ methodName ]( mode, start, count, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\n}\n\nfunction WebGLCapabilities( gl, extensions, parameters ) {\n\n\tlet maxAnisotropy;\n\n\tfunction getMaxAnisotropy() {\n\n\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\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\tgl.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\tgl.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\tconst isWebGL2 = typeof WebGL2RenderingContext !== 'undefined' && gl.constructor.name === 'WebGL2RenderingContext';\n\n\tlet precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\tconst 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\tconst drawBuffers = isWebGL2 || extensions.has( 'WEBGL_draw_buffers' );\n\n\tconst logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;\n\n\tconst maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\tconst maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\tconst maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\tconst maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\tconst maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\tconst maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\tconst maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\tconst maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\tconst vertexTextures = maxVertexTextures > 0;\n\tconst floatFragmentTextures = isWebGL2 || extensions.has( 'OES_texture_float' );\n\tconst floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\tconst maxSamples = isWebGL2 ? gl.getParameter( gl.MAX_SAMPLES ) : 0;\n\n\treturn {\n\n\t\tisWebGL2: isWebGL2,\n\n\t\tdrawBuffers: drawBuffers,\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\tmaxSamples: maxSamples\n\n\t};\n\n}\n\nfunction WebGLClipping( properties ) {\n\n\tconst scope = this;\n\n\tlet globalState = null,\n\t\tnumGlobalPlanes = 0,\n\t\tlocalClippingEnabled = false,\n\t\trenderingShadows = false;\n\n\tconst plane = 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 ) {\n\n\t\tconst 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\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\n\t};\n\n\tthis.setGlobalState = function ( planes, camera ) {\n\n\t\tglobalState = projectPlanes( planes, camera, 0 );\n\n\t};\n\n\tthis.setState = function ( material, camera, useCache ) {\n\n\t\tconst planes = material.clippingPlanes,\n\t\t\tclipIntersection = material.clipIntersection,\n\t\t\tclipShadows = material.clipShadows;\n\n\t\tconst materialProperties = properties.get( material );\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\tconst nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\tlGlobal = nGlobal * 4;\n\n\t\t\tlet dstArray = materialProperties.clippingState || null;\n\n\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, useCache );\n\n\t\t\tfor ( let i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t}\n\n\t\t\tmaterialProperties.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\tconst nPlanes = planes !== null ? planes.length : 0;\n\t\tlet dstArray = 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\tconst 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 ( let 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\t\tscope.numIntersection = 0;\n\n\t\treturn dstArray;\n\n\t}\n\n}\n\nfunction WebGLCubeMaps( renderer ) {\n\n\tlet cubemaps = new WeakMap();\n\n\tfunction mapTextureMapping( texture, mapping ) {\n\n\t\tif ( mapping === EquirectangularReflectionMapping ) {\n\n\t\t\ttexture.mapping = CubeReflectionMapping;\n\n\t\t} else if ( mapping === EquirectangularRefractionMapping ) {\n\n\t\t\ttexture.mapping = CubeRefractionMapping;\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture && texture.isRenderTargetTexture === false ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tif ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) {\n\n\t\t\t\tif ( cubemaps.has( texture ) ) {\n\n\t\t\t\t\tconst cubemap = cubemaps.get( texture ).texture;\n\t\t\t\t\treturn mapTextureMapping( cubemap, texture.mapping );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\tif ( image && image.height > 0 ) {\n\n\t\t\t\t\t\tconst renderTarget = new WebGLCubeRenderTarget( image.height / 2 );\n\t\t\t\t\t\trenderTarget.fromEquirectangularTexture( renderer, texture );\n\t\t\t\t\t\tcubemaps.set( texture, renderTarget );\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\treturn mapTextureMapping( renderTarget.texture, texture.mapping );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\treturn 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\treturn texture;\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemap = cubemaps.get( texture );\n\n\t\tif ( cubemap !== undefined ) {\n\n\t\t\tcubemaps.delete( texture );\n\t\t\tcubemap.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubemaps = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nclass OrthographicCamera extends Camera {\n\n\tconstructor( left = - 1, right = 1, top = 1, bottom = - 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\tthis.isOrthographicCamera = true;\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\tthis.zoom = 1;\n\t\tthis.view = null;\n\n\t\tthis.left = left;\n\t\tthis.right = right;\n\t\tthis.top = top;\n\t\tthis.bottom = bottom;\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( 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( 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() {\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() {\n\n\t\tconst dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\tconst dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\tconst cx = ( this.right + this.left ) / 2;\n\t\tconst cy = ( this.top + this.bottom ) / 2;\n\n\t\tlet left = cx - dx;\n\t\tlet right = cx + dx;\n\t\tlet top = cy + dy;\n\t\tlet bottom = cy - dy;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom;\n\t\t\tconst scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom;\n\n\t\t\tleft += scaleW * this.view.offsetX;\n\t\t\tright = left + scaleW * this.view.width;\n\t\t\ttop -= scaleH * this.view.offsetY;\n\t\t\tbottom = top - scaleH * this.view.height;\n\n\t\t}\n\n\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far, this.coordinateSystem );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( 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\nconst LOD_MIN = 4;\n\n// The standard deviations (radians) associated with the extra mips. These are\n// chosen to approximate a Trowbridge-Reitz distribution function times the\n// geometric shadowing function. These sigma values squared must match the\n// variance #defines in cube_uv_reflection_fragment.glsl.js.\nconst EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];\n\n// The maximum length of the blur for loop. Smaller sigmas will use fewer\n// samples and exit early, but not recompile the shader.\nconst MAX_SAMPLES = 20;\n\nconst _flatCamera = /*@__PURE__*/ new OrthographicCamera();\nconst _clearColor = /*@__PURE__*/ new Color();\nlet _oldTarget = null;\nlet _oldActiveCubeFace = 0;\nlet _oldActiveMipmapLevel = 0;\n\n// Golden Ratio\nconst PHI = ( 1 + Math.sqrt( 5 ) ) / 2;\nconst INV_PHI = 1 / PHI;\n\n// Vertices of a dodecahedron (except the opposites, which represent the\n// same axis), used as axis directions evenly spread on a sphere.\nconst _axisDirections = [\n\t/*@__PURE__*/ new Vector3( 1, 1, 1 ),\n\t/*@__PURE__*/ new Vector3( - 1, 1, 1 ),\n\t/*@__PURE__*/ new Vector3( 1, 1, - 1 ),\n\t/*@__PURE__*/ new Vector3( - 1, 1, - 1 ),\n\t/*@__PURE__*/ new Vector3( 0, PHI, INV_PHI ),\n\t/*@__PURE__*/ new Vector3( 0, PHI, - INV_PHI ),\n\t/*@__PURE__*/ new Vector3( INV_PHI, 0, PHI ),\n\t/*@__PURE__*/ new Vector3( - INV_PHI, 0, PHI ),\n\t/*@__PURE__*/ new Vector3( PHI, INV_PHI, 0 ),\n\t/*@__PURE__*/ new Vector3( - PHI, INV_PHI, 0 ) ];\n\n/**\n * This class generates a Prefiltered, Mipmapped Radiance Environment Map\n * (PMREM) from a cubeMap environment texture. This allows different levels of\n * blur to be quickly accessed based on material roughness. It is packed into a\n * special CubeUV format that allows us to perform custom interpolation so that\n * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap\n * chain, it only goes down to the LOD_MIN level (above), and then creates extra\n * even more filtered 'mips' at the same LOD_MIN resolution, associated with\n * higher roughness levels. In this way we maintain resolution to smoothly\n * interpolate diffuse lighting while limiting sampling computation.\n *\n * Paper: Fast, Accurate Image-Based Lighting\n * https://drive.google.com/file/d/15y8r_UpKlU9SvV4ILb0C3qCPecS8pvLz/view\n*/\n\nclass PMREMGenerator {\n\n\tconstructor( renderer ) {\n\n\t\tthis._renderer = renderer;\n\t\tthis._pingPongRenderTarget = null;\n\n\t\tthis._lodMax = 0;\n\t\tthis._cubeSize = 0;\n\t\tthis._lodPlanes = [];\n\t\tthis._sizeLods = [];\n\t\tthis._sigmas = [];\n\n\t\tthis._blurMaterial = null;\n\t\tthis._cubemapMaterial = null;\n\t\tthis._equirectMaterial = null;\n\n\t\tthis._compileMaterial( this._blurMaterial );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from a supplied Scene, which can be faster than using an\n\t * image if networking bandwidth is low. Optional sigma specifies a blur radius\n\t * in radians to be applied to the scene before PMREM generation. Optional near\n\t * and far planes ensure the scene is rendered in its entirety (the cubeCamera\n\t * is placed at the origin).\n\t */\n\tfromScene( scene, sigma = 0, near = 0.1, far = 100 ) {\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\n\t\tthis._setSize( 256 );\n\n\t\tconst cubeUVRenderTarget = this._allocateTargets();\n\t\tcubeUVRenderTarget.depthBuffer = true;\n\n\t\tthis._sceneToCubeUV( scene, near, far, cubeUVRenderTarget );\n\n\t\tif ( sigma > 0 ) {\n\n\t\t\tthis._blur( cubeUVRenderTarget, 0, 0, sigma );\n\n\t\t}\n\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an equirectangular texture, which can be either LDR\n\t * or HDR. The ideal input image size is 1k (1024 x 512),\n\t * as this matches best with the 256 x 256 cubemap output.\n\t */\n\tfromEquirectangular( equirectangular, renderTarget = null ) {\n\n\t\treturn this._fromTexture( equirectangular, renderTarget );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an cubemap texture, which can be either LDR\n\t * or HDR. The ideal input cube size is 256 x 256,\n\t * as this matches best with the 256 x 256 cubemap output.\n\t */\n\tfromCubemap( cubemap, renderTarget = null ) {\n\n\t\treturn this._fromTexture( cubemap, renderTarget );\n\n\t}\n\n\t/**\n\t * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileCubemapShader() {\n\n\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\t\t\tthis._compileMaterial( this._cubemapMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileEquirectangularShader() {\n\n\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\t\t\tthis._compileMaterial( this._equirectMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,\n\t * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on\n\t * one of them will cause any others to also become unusable.\n\t */\n\tdispose() {\n\n\t\tthis._dispose();\n\n\t\tif ( this._cubemapMaterial !== null ) this._cubemapMaterial.dispose();\n\t\tif ( this._equirectMaterial !== null ) this._equirectMaterial.dispose();\n\n\t}\n\n\t// private interface\n\n\t_setSize( cubeSize ) {\n\n\t\tthis._lodMax = Math.floor( Math.log2( cubeSize ) );\n\t\tthis._cubeSize = Math.pow( 2, this._lodMax );\n\n\t}\n\n\t_dispose() {\n\n\t\tif ( this._blurMaterial !== null ) this._blurMaterial.dispose();\n\n\t\tif ( this._pingPongRenderTarget !== null ) this._pingPongRenderTarget.dispose();\n\n\t\tfor ( let i = 0; i < this._lodPlanes.length; i ++ ) {\n\n\t\t\tthis._lodPlanes[ i ].dispose();\n\n\t\t}\n\n\t}\n\n\t_cleanup( outputTarget ) {\n\n\t\tthis._renderer.setRenderTarget( _oldTarget, _oldActiveCubeFace, _oldActiveMipmapLevel );\n\t\toutputTarget.scissorTest = false;\n\t\t_setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height );\n\n\t}\n\n\t_fromTexture( texture, renderTarget ) {\n\n\t\tif ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping ) {\n\n\t\t\tthis._setSize( texture.image.length === 0 ? 16 : ( texture.image[ 0 ].width || texture.image[ 0 ].image.width ) );\n\n\t\t} else { // Equirectangular\n\n\t\t\tthis._setSize( texture.image.width / 4 );\n\n\t\t}\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\n\t\tconst cubeUVRenderTarget = renderTarget || this._allocateTargets();\n\t\tthis._textureToCubeUV( texture, cubeUVRenderTarget );\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_allocateTargets() {\n\n\t\tconst width = 3 * Math.max( this._cubeSize, 16 * 7 );\n\t\tconst height = 4 * this._cubeSize;\n\n\t\tconst params = {\n\t\t\tmagFilter: LinearFilter,\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\ttype: HalfFloatType,\n\t\t\tformat: RGBAFormat,\n\t\t\tcolorSpace: LinearSRGBColorSpace,\n\t\t\tdepthBuffer: false\n\t\t};\n\n\t\tconst cubeUVRenderTarget = _createRenderTarget( width, height, params );\n\n\t\tif ( this._pingPongRenderTarget === null || this._pingPongRenderTarget.width !== width || this._pingPongRenderTarget.height !== height ) {\n\n\t\t\tif ( this._pingPongRenderTarget !== null ) {\n\n\t\t\t\tthis._dispose();\n\n\t\t\t}\n\n\t\t\tthis._pingPongRenderTarget = _createRenderTarget( width, height, params );\n\n\t\t\tconst { _lodMax } = this;\n\t\t\t( { sizeLods: this._sizeLods, lodPlanes: this._lodPlanes, sigmas: this._sigmas } = _createPlanes( _lodMax ) );\n\n\t\t\tthis._blurMaterial = _getBlurShader( _lodMax, width, height );\n\n\t\t}\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_compileMaterial( material ) {\n\n\t\tconst tmpMesh = new Mesh( this._lodPlanes[ 0 ], material );\n\t\tthis._renderer.compile( tmpMesh, _flatCamera );\n\n\t}\n\n\t_sceneToCubeUV( scene, near, far, cubeUVRenderTarget ) {\n\n\t\tconst fov = 90;\n\t\tconst aspect = 1;\n\t\tconst cubeCamera = new PerspectiveCamera( fov, aspect, near, far );\n\t\tconst upSign = [ 1, - 1, 1, 1, 1, 1 ];\n\t\tconst forwardSign = [ 1, 1, 1, - 1, - 1, - 1 ];\n\t\tconst renderer = this._renderer;\n\n\t\tconst originalAutoClear = renderer.autoClear;\n\t\tconst toneMapping = renderer.toneMapping;\n\t\trenderer.getClearColor( _clearColor );\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.autoClear = false;\n\n\t\tconst backgroundMaterial = new MeshBasicMaterial( {\n\t\t\tname: 'PMREM.Background',\n\t\t\tside: BackSide,\n\t\t\tdepthWrite: false,\n\t\t\tdepthTest: false,\n\t\t} );\n\n\t\tconst backgroundBox = new Mesh( new BoxGeometry(), backgroundMaterial );\n\n\t\tlet useSolidColor = false;\n\t\tconst background = scene.background;\n\n\t\tif ( background ) {\n\n\t\t\tif ( background.isColor ) {\n\n\t\t\t\tbackgroundMaterial.color.copy( background );\n\t\t\t\tscene.background = null;\n\t\t\t\tuseSolidColor = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tbackgroundMaterial.color.copy( _clearColor );\n\t\t\tuseSolidColor = true;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst col = i % 3;\n\n\t\t\tif ( col === 0 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.lookAt( forwardSign[ i ], 0, 0 );\n\n\t\t\t} else if ( col === 1 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, 0, upSign[ i ] );\n\t\t\t\tcubeCamera.lookAt( 0, forwardSign[ i ], 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.lookAt( 0, 0, forwardSign[ i ] );\n\n\t\t\t}\n\n\t\t\tconst size = this._cubeSize;\n\n\t\t\t_setViewport( cubeUVRenderTarget, col * size, i > 2 ? size : 0, size, size );\n\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\n\t\t\tif ( useSolidColor ) {\n\n\t\t\t\trenderer.render( backgroundBox, cubeCamera );\n\n\t\t\t}\n\n\t\t\trenderer.render( scene, cubeCamera );\n\n\t\t}\n\n\t\tbackgroundBox.geometry.dispose();\n\t\tbackgroundBox.material.dispose();\n\n\t\trenderer.toneMapping = toneMapping;\n\t\trenderer.autoClear = originalAutoClear;\n\t\tscene.background = background;\n\n\t}\n\n\t_textureToCubeUV( texture, cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\n\t\tconst isCubeTexture = ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping );\n\n\t\tif ( isCubeTexture ) {\n\n\t\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\n\t\t\t}\n\n\t\t\tthis._cubemapMaterial.uniforms.flipEnvMap.value = ( texture.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t} else {\n\n\t\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst material = isCubeTexture ? this._cubemapMaterial : this._equirectMaterial;\n\t\tconst mesh = new Mesh( this._lodPlanes[ 0 ], material );\n\n\t\tconst uniforms = material.uniforms;\n\n\t\tuniforms[ 'envMap' ].value = texture;\n\n\t\tconst size = this._cubeSize;\n\n\t\t_setViewport( cubeUVRenderTarget, 0, 0, 3 * size, 2 * size );\n\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( mesh, _flatCamera );\n\n\t}\n\n\t_applyPMREM( cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst autoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tfor ( let i = 1; i < this._lodPlanes.length; i ++ ) {\n\n\t\t\tconst sigma = Math.sqrt( this._sigmas[ i ] * this._sigmas[ i ] - this._sigmas[ i - 1 ] * this._sigmas[ i - 1 ] );\n\n\t\t\tconst poleAxis = _axisDirections[ ( i - 1 ) % _axisDirections.length ];\n\n\t\t\tthis._blur( cubeUVRenderTarget, i - 1, i, sigma, poleAxis );\n\n\t\t}\n\n\t\trenderer.autoClear = autoClear;\n\n\t}\n\n\t/**\n\t * This is a two-pass Gaussian blur for a cubemap. Normally this is done\n\t * vertically and horizontally, but this breaks down on a cube. Here we apply\n\t * the blur latitudinally (around the poles), and then longitudinally (towards\n\t * the poles) to approximate the orthogonally-separable blur. It is least\n\t * accurate at the poles, but still does a decent job.\n\t */\n\t_blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) {\n\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tthis._halfBlur(\n\t\t\tcubeUVRenderTarget,\n\t\t\tpingPongRenderTarget,\n\t\t\tlodIn,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'latitudinal',\n\t\t\tpoleAxis );\n\n\t\tthis._halfBlur(\n\t\t\tpingPongRenderTarget,\n\t\t\tcubeUVRenderTarget,\n\t\t\tlodOut,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'longitudinal',\n\t\t\tpoleAxis );\n\n\t}\n\n\t_halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst blurMaterial = this._blurMaterial;\n\n\t\tif ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {\n\n\t\t\tconsole.error(\n\t\t\t\t'blur direction must be either latitudinal or longitudinal!' );\n\n\t\t}\n\n\t\t// Number of standard deviations at which to cut off the discrete approximation.\n\t\tconst STANDARD_DEVIATIONS = 3;\n\n\t\tconst blurMesh = new Mesh( this._lodPlanes[ lodOut ], blurMaterial );\n\t\tconst blurUniforms = blurMaterial.uniforms;\n\n\t\tconst pixels = this._sizeLods[ lodIn ] - 1;\n\t\tconst radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );\n\t\tconst sigmaPixels = sigmaRadians / radiansPerPixel;\n\t\tconst samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;\n\n\t\tif ( samples > MAX_SAMPLES ) {\n\n\t\t\tconsole.warn( `sigmaRadians, ${\n\t\t\t\tsigmaRadians}, is too large and will clip, as it requested ${\n\t\t\t\tsamples} samples when the maximum is set to ${MAX_SAMPLES}` );\n\n\t\t}\n\n\t\tconst weights = [];\n\t\tlet sum = 0;\n\n\t\tfor ( let i = 0; i < MAX_SAMPLES; ++ i ) {\n\n\t\t\tconst x = i / sigmaPixels;\n\t\t\tconst weight = Math.exp( - x * x / 2 );\n\t\t\tweights.push( weight );\n\n\t\t\tif ( i === 0 ) {\n\n\t\t\t\tsum += weight;\n\n\t\t\t} else if ( i < samples ) {\n\n\t\t\t\tsum += 2 * weight;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < weights.length; i ++ ) {\n\n\t\t\tweights[ i ] = weights[ i ] / sum;\n\n\t\t}\n\n\t\tblurUniforms[ 'envMap' ].value = targetIn.texture;\n\t\tblurUniforms[ 'samples' ].value = samples;\n\t\tblurUniforms[ 'weights' ].value = weights;\n\t\tblurUniforms[ 'latitudinal' ].value = direction === 'latitudinal';\n\n\t\tif ( poleAxis ) {\n\n\t\t\tblurUniforms[ 'poleAxis' ].value = poleAxis;\n\n\t\t}\n\n\t\tconst { _lodMax } = this;\n\t\tblurUniforms[ 'dTheta' ].value = radiansPerPixel;\n\t\tblurUniforms[ 'mipInt' ].value = _lodMax - lodIn;\n\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t_setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( targetOut );\n\t\trenderer.render( blurMesh, _flatCamera );\n\n\t}\n\n}\n\n\n\nfunction _createPlanes( lodMax ) {\n\n\tconst lodPlanes = [];\n\tconst sizeLods = [];\n\tconst sigmas = [];\n\n\tlet lod = lodMax;\n\n\tconst totalLods = lodMax - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length;\n\n\tfor ( let i = 0; i < totalLods; i ++ ) {\n\n\t\tconst sizeLod = Math.pow( 2, lod );\n\t\tsizeLods.push( sizeLod );\n\t\tlet sigma = 1.0 / sizeLod;\n\n\t\tif ( i > lodMax - LOD_MIN ) {\n\n\t\t\tsigma = EXTRA_LOD_SIGMA[ i - lodMax + LOD_MIN - 1 ];\n\n\t\t} else if ( i === 0 ) {\n\n\t\t\tsigma = 0;\n\n\t\t}\n\n\t\tsigmas.push( sigma );\n\n\t\tconst texelSize = 1.0 / ( sizeLod - 2 );\n\t\tconst min = - texelSize;\n\t\tconst max = 1 + texelSize;\n\t\tconst uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ];\n\n\t\tconst cubeFaces = 6;\n\t\tconst vertices = 6;\n\t\tconst positionSize = 3;\n\t\tconst uvSize = 2;\n\t\tconst faceIndexSize = 1;\n\n\t\tconst position = new Float32Array( positionSize * vertices * cubeFaces );\n\t\tconst uv = new Float32Array( uvSize * vertices * cubeFaces );\n\t\tconst faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );\n\n\t\tfor ( let face = 0; face < cubeFaces; face ++ ) {\n\n\t\t\tconst x = ( face % 3 ) * 2 / 3 - 1;\n\t\t\tconst y = face > 2 ? 0 : - 1;\n\t\t\tconst coordinates = [\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y + 1, 0\n\t\t\t];\n\t\t\tposition.set( coordinates, positionSize * vertices * face );\n\t\t\tuv.set( uv1, uvSize * vertices * face );\n\t\t\tconst fill = [ face, face, face, face, face, face ];\n\t\t\tfaceIndex.set( fill, faceIndexSize * vertices * face );\n\n\t\t}\n\n\t\tconst planes = new BufferGeometry();\n\t\tplanes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );\n\t\tplanes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );\n\t\tplanes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );\n\t\tlodPlanes.push( planes );\n\n\t\tif ( lod > LOD_MIN ) {\n\n\t\t\tlod --;\n\n\t\t}\n\n\t}\n\n\treturn { lodPlanes, sizeLods, sigmas };\n\n}\n\nfunction _createRenderTarget( width, height, params ) {\n\n\tconst cubeUVRenderTarget = new WebGLRenderTarget( width, height, params );\n\tcubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping;\n\tcubeUVRenderTarget.texture.name = 'PMREM.cubeUv';\n\tcubeUVRenderTarget.scissorTest = true;\n\treturn cubeUVRenderTarget;\n\n}\n\nfunction _setViewport( target, x, y, width, height ) {\n\n\ttarget.viewport.set( x, y, width, height );\n\ttarget.scissor.set( x, y, width, height );\n\n}\n\nfunction _getBlurShader( lodMax, width, height ) {\n\n\tconst weights = new Float32Array( MAX_SAMPLES );\n\tconst poleAxis = new Vector3( 0, 1, 0 );\n\tconst shaderMaterial = new ShaderMaterial( {\n\n\t\tname: 'SphericalGaussianBlur',\n\n\t\tdefines: {\n\t\t\t'n': MAX_SAMPLES,\n\t\t\t'CUBEUV_TEXEL_WIDTH': 1.0 / width,\n\t\t\t'CUBEUV_TEXEL_HEIGHT': 1.0 / height,\n\t\t\t'CUBEUV_MAX_MIP': `${lodMax}.0`,\n\t\t},\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'samples': { value: 1 },\n\t\t\t'weights': { value: weights },\n\t\t\t'latitudinal': { value: false },\n\t\t\t'dTheta': { value: 0 },\n\t\t\t'mipInt': { value: 0 },\n\t\t\t'poleAxis': { value: poleAxis }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include <cube_uv_reflection_fragment>\n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getEquirectMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'EquirectangularToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include <common>\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCubemapMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'CubemapToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'flipEnvMap': { value: - 1 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCommonVertexShader() {\n\n\treturn /* glsl */`\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t`;\n\n}\n\nfunction WebGLCubeUVMaps( renderer ) {\n\n\tlet cubeUVmaps = new WeakMap();\n\n\tlet pmremGenerator = null;\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tconst isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping );\n\t\t\tconst isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );\n\n\t\t\t// equirect/cube map to cubeUV conversion\n\n\t\t\tif ( isEquirectMap || isCubeMap ) {\n\n\t\t\t\tif ( texture.isRenderTargetTexture && texture.needsPMREMUpdate === true ) {\n\n\t\t\t\t\ttexture.needsPMREMUpdate = false;\n\n\t\t\t\t\tlet renderTarget = cubeUVmaps.get( texture );\n\n\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget );\n\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( cubeUVmaps.has( texture ) ) {\n\n\t\t\t\t\t\treturn cubeUVmaps.get( texture ).texture;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\t\tif ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) {\n\n\t\t\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\t\t\tconst renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );\n\t\t\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\t\treturn null;\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 texture;\n\n\t}\n\n\tfunction isCubeTextureComplete( image ) {\n\n\t\tlet count = 0;\n\t\tconst length = 6;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tif ( image[ i ] !== undefined ) count ++;\n\n\t\t}\n\n\t\treturn count === length;\n\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemapUV = cubeUVmaps.get( texture );\n\n\t\tif ( cubemapUV !== undefined ) {\n\n\t\t\tcubeUVmaps.delete( texture );\n\t\t\tcubemapUV.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubeUVmaps = new WeakMap();\n\n\t\tif ( pmremGenerator !== null ) {\n\n\t\t\tpmremGenerator.dispose();\n\t\t\tpmremGenerator = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLExtensions( gl ) {\n\n\tconst extensions = {};\n\n\tfunction getExtension( name ) {\n\n\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\treturn extensions[ name ];\n\n\t\t}\n\n\t\tlet extension;\n\n\t\tswitch ( name ) {\n\n\t\t\tcase 'WEBGL_depth_texture':\n\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\tbreak;\n\n\t\t\tcase 'EXT_texture_filter_anisotropic':\n\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\tbreak;\n\n\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\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\tbreak;\n\n\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\textension = gl.getExtension( name );\n\n\t\t}\n\n\t\textensions[ name ] = extension;\n\n\t\treturn extension;\n\n\t}\n\n\treturn {\n\n\t\thas: function ( name ) {\n\n\t\t\treturn getExtension( name ) !== null;\n\n\t\t},\n\n\t\tinit: function ( capabilities ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\tgetExtension( 'EXT_color_buffer_float' );\n\n\t\t\t} else {\n\n\t\t\t\tgetExtension( 'WEBGL_depth_texture' );\n\t\t\t\tgetExtension( 'OES_texture_float' );\n\t\t\t\tgetExtension( 'OES_texture_half_float' );\n\t\t\t\tgetExtension( 'OES_texture_half_float_linear' );\n\t\t\t\tgetExtension( 'OES_standard_derivatives' );\n\t\t\t\tgetExtension( 'OES_element_index_uint' );\n\t\t\t\tgetExtension( 'OES_vertex_array_object' );\n\t\t\t\tgetExtension( 'ANGLE_instanced_arrays' );\n\n\t\t\t}\n\n\t\t\tgetExtension( 'OES_texture_float_linear' );\n\t\t\tgetExtension( 'EXT_color_buffer_half_float' );\n\t\t\tgetExtension( 'WEBGL_multisampled_render_to_texture' );\n\n\t\t},\n\n\t\tget: function ( name ) {\n\n\t\t\tconst extension = getExtension( name );\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\treturn extension;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLGeometries( gl, attributes, info, bindingStates ) {\n\n\tconst geometries = {};\n\tconst wireframeAttributes = new WeakMap();\n\n\tfunction onGeometryDispose( event ) {\n\n\t\tconst geometry = event.target;\n\n\t\tif ( geometry.index !== null ) {\n\n\t\t\tattributes.remove( geometry.index );\n\n\t\t}\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tattributes.remove( geometry.attributes[ name ] );\n\n\t\t}\n\n\t\tfor ( const name in geometry.morphAttributes ) {\n\n\t\t\tconst array = geometry.morphAttributes[ name ];\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tattributes.remove( array[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\tdelete geometries[ geometry.id ];\n\n\t\tconst attribute = wireframeAttributes.get( geometry );\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\twireframeAttributes.delete( geometry );\n\n\t\t}\n\n\t\tbindingStates.releaseStatesOfGeometry( geometry );\n\n\t\tif ( geometry.isInstancedBufferGeometry === true ) {\n\n\t\t\tdelete geometry._maxInstanceCount;\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\tif ( geometries[ geometry.id ] === true ) return geometry;\n\n\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\tgeometries[ geometry.id ] = true;\n\n\t\tinfo.memory.geometries ++;\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction update( geometry ) {\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates.\n\n\t\tfor ( const 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\tconst morphAttributes = geometry.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = morphAttributes[ name ];\n\n\t\t\tfor ( let 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 updateWireframeAttribute( geometry ) {\n\n\t\tconst indices = [];\n\n\t\tconst geometryIndex = geometry.index;\n\t\tconst geometryPosition = geometry.attributes.position;\n\t\tlet version = 0;\n\n\t\tif ( geometryIndex !== null ) {\n\n\t\t\tconst array = geometryIndex.array;\n\t\t\tversion = geometryIndex.version;\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tconst a = array[ i + 0 ];\n\t\t\t\tconst b = array[ i + 1 ];\n\t\t\t\tconst 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 if ( geometryPosition !== undefined ) {\n\n\t\t\tconst array = geometryPosition.array;\n\t\t\tversion = geometryPosition.version;\n\n\t\t\tfor ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\tconst a = i + 0;\n\t\t\t\tconst b = i + 1;\n\t\t\t\tconst 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} else {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\t\tattribute.version = version;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates\n\n\t\t//\n\n\t\tconst previousAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( previousAttribute ) attributes.remove( previousAttribute );\n\n\t\t//\n\n\t\twireframeAttributes.set( geometry, attribute );\n\n\t}\n\n\tfunction getWireframeAttribute( geometry ) {\n\n\t\tconst currentAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( currentAttribute ) {\n\n\t\t\tconst geometryIndex = geometry.index;\n\n\t\t\tif ( geometryIndex !== null ) {\n\n\t\t\t\t// if the attribute is obsolete, create a new one\n\n\t\t\t\tif ( currentAttribute.version < geometryIndex.version ) {\n\n\t\t\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t}\n\n\t\treturn wireframeAttributes.get( geometry );\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\nfunction WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tlet 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, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tlet extension, methodName;\n\n\t\tif ( isWebGL2 ) {\n\n\t\t\textension = gl;\n\t\t\tmethodName = 'drawElementsInstanced';\n\n\t\t} else {\n\n\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\t\t\tmethodName = 'drawElementsInstancedANGLE';\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLIndexedBufferRenderer: 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\textension[ methodName ]( mode, count, type, start * bytesPerElement, primcount );\n\n\t\tinfo.update( count, mode, primcount );\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\nfunction WebGLInfo( gl ) {\n\n\tconst memory = {\n\t\tgeometries: 0,\n\t\ttextures: 0\n\t};\n\n\tconst 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\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.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.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\nfunction numericalSort( a, b ) {\n\n\treturn a[ 0 ] - b[ 0 ];\n\n}\n\nfunction absNumericalSort( a, b ) {\n\n\treturn Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );\n\n}\n\nfunction WebGLMorphtargets( gl, capabilities, textures ) {\n\n\tconst influencesList = {};\n\tconst morphInfluences = new Float32Array( 8 );\n\tconst morphTextures = new WeakMap();\n\tconst morph = new Vector4();\n\n\tconst workInfluences = [];\n\n\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\tworkInfluences[ i ] = [ i, 0 ];\n\n\t}\n\n\tfunction update( object, geometry, program ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tif ( capabilities.isWebGL2 === true ) {\n\n\t\t\t// instead of using attributes, the WebGL 2 code path encodes morph targets\n\t\t\t// into an array of data textures. Each layer represents a single morph target.\n\n\t\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\t\tlet entry = morphTextures.get( geometry );\n\n\t\t\tif ( entry === undefined || entry.count !== morphTargetsCount ) {\n\n\t\t\t\tif ( entry !== undefined ) entry.texture.dispose();\n\n\t\t\t\tconst hasMorphPosition = geometry.morphAttributes.position !== undefined;\n\t\t\t\tconst hasMorphNormals = geometry.morphAttributes.normal !== undefined;\n\t\t\t\tconst hasMorphColors = geometry.morphAttributes.color !== undefined;\n\n\t\t\t\tconst morphTargets = geometry.morphAttributes.position || [];\n\t\t\t\tconst morphNormals = geometry.morphAttributes.normal || [];\n\t\t\t\tconst morphColors = geometry.morphAttributes.color || [];\n\n\t\t\t\tlet vertexDataCount = 0;\n\n\t\t\t\tif ( hasMorphPosition === true ) vertexDataCount = 1;\n\t\t\t\tif ( hasMorphNormals === true ) vertexDataCount = 2;\n\t\t\t\tif ( hasMorphColors === true ) vertexDataCount = 3;\n\n\t\t\t\tlet width = geometry.attributes.position.count * vertexDataCount;\n\t\t\t\tlet height = 1;\n\n\t\t\t\tif ( width > capabilities.maxTextureSize ) {\n\n\t\t\t\t\theight = Math.ceil( width / capabilities.maxTextureSize );\n\t\t\t\t\twidth = capabilities.maxTextureSize;\n\n\t\t\t\t}\n\n\t\t\t\tconst buffer = new Float32Array( width * height * 4 * morphTargetsCount );\n\n\t\t\t\tconst texture = new DataArrayTexture( buffer, width, height, morphTargetsCount );\n\t\t\t\ttexture.type = FloatType;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t// fill buffer\n\n\t\t\t\tconst vertexDataStride = vertexDataCount * 4;\n\n\t\t\t\tfor ( let i = 0; i < morphTargetsCount; i ++ ) {\n\n\t\t\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\t\t\tconst morphNormal = morphNormals[ i ];\n\t\t\t\t\tconst morphColor = morphColors[ i ];\n\n\t\t\t\t\tconst offset = width * height * 4 * i;\n\n\t\t\t\t\tfor ( let j = 0; j < morphTarget.count; j ++ ) {\n\n\t\t\t\t\t\tconst stride = j * vertexDataStride;\n\n\t\t\t\t\t\tif ( hasMorphPosition === true ) {\n\n\t\t\t\t\t\t\tmorph.fromBufferAttribute( morphTarget, j );\n\n\t\t\t\t\t\t\tbuffer[ offset + stride + 0 ] = morph.x;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 1 ] = morph.y;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 2 ] = morph.z;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 3 ] = 0;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasMorphNormals === true ) {\n\n\t\t\t\t\t\t\tmorph.fromBufferAttribute( morphNormal, j );\n\n\t\t\t\t\t\t\tbuffer[ offset + stride + 4 ] = morph.x;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 5 ] = morph.y;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 6 ] = morph.z;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 7 ] = 0;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasMorphColors === true ) {\n\n\t\t\t\t\t\t\tmorph.fromBufferAttribute( morphColor, j );\n\n\t\t\t\t\t\t\tbuffer[ offset + stride + 8 ] = morph.x;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 9 ] = morph.y;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 10 ] = morph.z;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? morph.w : 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\tentry = {\n\t\t\t\t\tcount: morphTargetsCount,\n\t\t\t\t\ttexture: texture,\n\t\t\t\t\tsize: new Vector2( width, height )\n\t\t\t\t};\n\n\t\t\t\tmorphTextures.set( geometry, entry );\n\n\t\t\t\tfunction disposeTexture() {\n\n\t\t\t\t\ttexture.dispose();\n\n\t\t\t\t\tmorphTextures.delete( geometry );\n\n\t\t\t\t\tgeometry.removeEventListener( 'dispose', disposeTexture );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.addEventListener( 'dispose', disposeTexture );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );\n\n\n\t\t} else {\n\n\t\t\t// When object doesn't have morph target influences defined, we treat it as a 0-length array\n\t\t\t// This is important to make sure we set up morphTargetBaseInfluence / morphTargetInfluences\n\n\t\t\tconst length = objectInfluences === undefined ? 0 : objectInfluences.length;\n\n\t\t\tlet influences = influencesList[ geometry.id ];\n\n\t\t\tif ( influences === undefined || influences.length !== length ) {\n\n\t\t\t\t// initialise list\n\n\t\t\t\tinfluences = [];\n\n\t\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tinfluences[ i ] = [ i, 0 ];\n\n\t\t\t\t}\n\n\t\t\t\tinfluencesList[ geometry.id ] = influences;\n\n\t\t\t}\n\n\t\t\t// Collect influences\n\n\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\tconst influence = influences[ i ];\n\n\t\t\t\tinfluence[ 0 ] = i;\n\t\t\t\tinfluence[ 1 ] = objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tinfluences.sort( absNumericalSort );\n\n\t\t\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\t\t\tif ( i < length && influences[ i ][ 1 ] ) {\n\n\t\t\t\t\tworkInfluences[ i ][ 0 ] = influences[ i ][ 0 ];\n\t\t\t\t\tworkInfluences[ i ][ 1 ] = influences[ i ][ 1 ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tworkInfluences[ i ][ 0 ] = Number.MAX_SAFE_INTEGER;\n\t\t\t\t\tworkInfluences[ i ][ 1 ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tworkInfluences.sort( numericalSort );\n\n\t\t\tconst morphTargets = geometry.morphAttributes.position;\n\t\t\tconst morphNormals = geometry.morphAttributes.normal;\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\t\t\tconst influence = workInfluences[ i ];\n\t\t\t\tconst index = influence[ 0 ];\n\t\t\t\tconst value = influence[ 1 ];\n\n\t\t\t\tif ( index !== Number.MAX_SAFE_INTEGER && value ) {\n\n\t\t\t\t\tif ( morphTargets && geometry.getAttribute( 'morphTarget' + i ) !== morphTargets[ index ] ) {\n\n\t\t\t\t\t\tgeometry.setAttribute( 'morphTarget' + i, morphTargets[ index ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( morphNormals && geometry.getAttribute( 'morphNormal' + i ) !== morphNormals[ index ] ) {\n\n\t\t\t\t\t\tgeometry.setAttribute( 'morphNormal' + i, morphNormals[ index ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmorphInfluences[ i ] = value;\n\t\t\t\t\tmorphInfluencesSum += value;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( morphTargets && geometry.hasAttribute( 'morphTarget' + i ) === true ) {\n\n\t\t\t\t\t\tgeometry.deleteAttribute( 'morphTarget' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( morphNormals && geometry.hasAttribute( 'morphNormal' + i ) === true ) {\n\n\t\t\t\t\t\tgeometry.deleteAttribute( 'morphNormal' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmorphInfluences[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// GLSL shader uses formula baseinfluence * base + sum(target * influence)\n\t\t\t// This allows us to switch between absolute morphs and relative morphs without changing shader code\n\t\t\t// When baseinfluence = 1 - sum(influence), the above is equivalent to sum((target - base) * influence)\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences );\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tupdate: update\n\n\t};\n\n}\n\nfunction WebGLObjects( gl, geometries, attributes, info ) {\n\n\tlet updateMap = new WeakMap();\n\n\tfunction update( object ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\tconst geometry = object.geometry;\n\t\tconst buffergeometry = geometries.get( object, geometry );\n\n\t\t// Update once per frame\n\n\t\tif ( updateMap.get( buffergeometry ) !== frame ) {\n\n\t\t\tgeometries.update( buffergeometry );\n\n\t\t\tupdateMap.set( buffergeometry, frame );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\tif ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) {\n\n\t\t\t\tobject.addEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\t\t}\n\n\t\t\tif ( updateMap.get( object ) !== frame ) {\n\n\t\t\t\tattributes.update( object.instanceMatrix, gl.ARRAY_BUFFER );\n\n\t\t\t\tif ( object.instanceColor !== null ) {\n\n\t\t\t\t\tattributes.update( object.instanceColor, gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t\tupdateMap.set( object, frame );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tconst skeleton = object.skeleton;\n\n\t\t\tif ( updateMap.get( skeleton ) !== frame ) {\n\n\t\t\t\tskeleton.update();\n\n\t\t\t\tupdateMap.set( skeleton, frame );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tupdateMap = new WeakMap();\n\n\t}\n\n\tfunction onInstancedMeshDispose( event ) {\n\n\t\tconst instancedMesh = event.target;\n\n\t\tinstancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\tattributes.remove( instancedMesh.instanceMatrix );\n\n\t\tif ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update,\n\t\tdispose: dispose\n\n\t};\n\n}\n\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 )'.\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, [textures] )\n *\n * \t\tuploads a uniform value(s)\n * \tthe 'textures' parameter is needed for sampler uniforms\n *\n *\n * Static methods of the top-level container (textures factorizations):\n *\n * .upload( gl, seq, values, textures )\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 (textures factorizations):\n *\n * .setValue( gl, name, value, textures )\n *\n * \t\tsets uniform with name 'name' to 'value'\n *\n * .setOptional( gl, obj, prop )\n *\n * \t\tlike .set for an optional property of the object\n *\n */\n\n\nconst emptyTexture = /*@__PURE__*/ new Texture();\nconst emptyArrayTexture = /*@__PURE__*/ new DataArrayTexture();\nconst empty3dTexture = /*@__PURE__*/ new Data3DTexture();\nconst emptyCubeTexture = /*@__PURE__*/ new CubeTexture();\n\n// --- Utilities ---\n\n// Array Caches (provide typed arrays for temporary by size)\n\nconst arrayCacheF32 = [];\nconst arrayCacheI32 = [];\n\n// Float32Array caches used for uploading Matrix uniforms\n\nconst mat4array = new Float32Array( 16 );\nconst mat3array = new Float32Array( 9 );\nconst mat2array = new Float32Array( 4 );\n\n// Flattening for arrays of vectors and matrices\n\nfunction flatten( array, nBlocks, blockSize ) {\n\n\tconst 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\tconst n = nBlocks * blockSize;\n\tlet r = 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 ( let 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\nfunction arraysEqual( a, b ) {\n\n\tif ( a.length !== b.length ) return false;\n\n\tfor ( let i = 0, l = a.length; i < l; i ++ ) {\n\n\t\tif ( a[ i ] !== b[ i ] ) return false;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction copyArray( a, b ) {\n\n\tfor ( let i = 0, l = b.length; i < l; i ++ ) {\n\n\t\ta[ i ] = b[ i ];\n\n\t}\n\n}\n\n// Texture unit allocation\n\nfunction allocTexUnits( textures, n ) {\n\n\tlet 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 ( let i = 0; i !== n; ++ i ) {\n\n\t\tr[ i ] = textures.allocateTextureUnit();\n\n\t}\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 setValueV1f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1f( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single float vector (from flat array or THREE.VectorN)\n\nfunction setValueV2f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2f( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else if ( v.r !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {\n\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\n\t\t\tcache[ 0 ] = v.r;\n\t\t\tcache[ 1 ] = v.g;\n\t\t\tcache[ 2 ] = v.b;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single matrix (from flat array or THREE.MatrixN)\n\nfunction setValueM2( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat2array.set( elements );\n\n\t\tgl.uniformMatrix2fv( this.addr, false, mat2array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM3( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat3array.set( elements );\n\n\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM4( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat4array.set( elements );\n\n\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\n// Single integer / boolean\n\nfunction setValueV1i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1i( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single integer / boolean vector (from flat array or THREE.VectorN)\n\nfunction setValueV2i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2i( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3i( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4i( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single unsigned integer\n\nfunction setValueV1ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1ui( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single unsigned integer vector (from flat array or THREE.VectorN)\n\nfunction setValueV2ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2ui( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3ui( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4ui( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n\n// Single texture (2D / Cube)\n\nfunction setValueT1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2D( v || emptyTexture, unit );\n\n}\n\nfunction setValueT3D1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture3D( v || empty3dTexture, unit );\n\n}\n\nfunction setValueT6( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTextureCube( v || emptyCubeTexture, unit );\n\n}\n\nfunction setValueT2DArray1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2DArray( v || emptyArrayTexture, unit );\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 setValueV1f; // FLOAT\n\t\tcase 0x8b50: return setValueV2f; // _VEC2\n\t\tcase 0x8b51: return setValueV3f; // _VEC3\n\t\tcase 0x8b52: return setValueV4f; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2; // _MAT2\n\t\tcase 0x8b5b: return setValueM3; // _MAT3\n\t\tcase 0x8b5c: return setValueM4; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2i; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3i; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4i; // _VEC4\n\n\t\tcase 0x1405: return setValueV1ui; // UINT\n\t\tcase 0x8dc6: return setValueV2ui; // _VEC2\n\t\tcase 0x8dc7: return setValueV3ui; // _VEC3\n\t\tcase 0x8dc8: return setValueV4ui; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3D1;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArray1;\n\n\t}\n\n}\n\n\n// Array of scalars\n\nfunction setValueV1fArray( gl, v ) {\n\n\tgl.uniform1fv( this.addr, v );\n\n}\n\n// Array of vectors (from flat array or array of THREE.VectorN)\n\nfunction setValueV2fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 2 );\n\n\tgl.uniform2fv( this.addr, data );\n\n}\n\nfunction setValueV3fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 3 );\n\n\tgl.uniform3fv( this.addr, data );\n\n}\n\nfunction setValueV4fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniform4fv( this.addr, data );\n\n}\n\n// Array of matrices (from flat array or array of THREE.MatrixN)\n\nfunction setValueM2Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniformMatrix2fv( this.addr, false, data );\n\n}\n\nfunction setValueM3Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 9 );\n\n\tgl.uniformMatrix3fv( this.addr, false, data );\n\n}\n\nfunction setValueM4Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 16 );\n\n\tgl.uniformMatrix4fv( this.addr, false, data );\n\n}\n\n// Array of integer / boolean\n\nfunction setValueV1iArray( gl, v ) {\n\n\tgl.uniform1iv( this.addr, v );\n\n}\n\n// Array of integer / boolean vectors (from flat array)\n\nfunction setValueV2iArray( gl, v ) {\n\n\tgl.uniform2iv( this.addr, v );\n\n}\n\nfunction setValueV3iArray( gl, v ) {\n\n\tgl.uniform3iv( this.addr, v );\n\n}\n\nfunction setValueV4iArray( gl, v ) {\n\n\tgl.uniform4iv( this.addr, v );\n\n}\n\n// Array of unsigned integer\n\nfunction setValueV1uiArray( gl, v ) {\n\n\tgl.uniform1uiv( this.addr, v );\n\n}\n\n// Array of unsigned integer vectors (from flat array)\n\nfunction setValueV2uiArray( gl, v ) {\n\n\tgl.uniform2uiv( this.addr, v );\n\n}\n\nfunction setValueV3uiArray( gl, v ) {\n\n\tgl.uniform3uiv( this.addr, v );\n\n}\n\nfunction setValueV4uiArray( gl, v ) {\n\n\tgl.uniform4uiv( this.addr, v );\n\n}\n\n\n// Array of textures (2D / 3D / Cube / 2DArray)\n\nfunction setValueT1Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT3DArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture3D( v[ i ] || empty3dTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT6Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT2DArrayArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2DArray( v[ i ] || emptyArrayTexture, units[ i ] );\n\n\t}\n\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 setValueV1fArray; // FLOAT\n\t\tcase 0x8b50: return setValueV2fArray; // _VEC2\n\t\tcase 0x8b51: return setValueV3fArray; // _VEC3\n\t\tcase 0x8b52: return setValueV4fArray; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2Array; // _MAT2\n\t\tcase 0x8b5b: return setValueM3Array; // _MAT3\n\t\tcase 0x8b5c: return setValueM4Array; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4\n\n\t\tcase 0x1405: return setValueV1uiArray; // UINT\n\t\tcase 0x8dc6: return setValueV2uiArray; // _VEC2\n\t\tcase 0x8dc7: return setValueV3uiArray; // _VEC3\n\t\tcase 0x8dc8: return setValueV4uiArray; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1Array;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3DArray;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6Array;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArrayArray;\n\n\t}\n\n}\n\n// --- Uniform Classes ---\n\nclass SingleUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass PureArrayUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.size = activeInfo.size;\n\t\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass StructuredUniform {\n\n\tconstructor( id ) {\n\n\t\tthis.id = id;\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\tsetValue( gl, value, textures ) {\n\n\t\tconst seq = this.seq;\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ], textures );\n\n\t\t}\n\n\t}\n\n}\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nconst RePathPart = /(\\w+)(\\])?(\\[|\\.)?/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\tconst 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\twhile ( true ) {\n\n\t\tconst match = RePathPart.exec( path ),\n\t\t\tmatchEnd = RePathPart.lastIndex;\n\n\t\tlet id = match[ 1 ];\n\t\tconst idIsIndex = 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\tconst map = container.map;\n\t\t\tlet 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\nclass WebGLUniforms {\n\n\tconstructor( gl, program ) {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t\tconst n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( let i = 0; i < n; ++ i ) {\n\n\t\t\tconst info = gl.getActiveUniform( program, i ),\n\t\t\t\taddr = gl.getUniformLocation( program, info.name );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tsetValue( gl, name, value, textures ) {\n\n\t\tconst u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, textures );\n\n\t}\n\n\tsetOptional( gl, object, name ) {\n\n\t\tconst v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t}\n\n\tstatic upload( gl, seq, values, textures ) {\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\t\tu.setValue( gl, v.value, textures );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tstatic seqWithValue( seq, values ) {\n\n\t\tconst r = [];\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tif ( u.id in values ) r.push( u );\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n}\n\nfunction WebGLShader( gl, type, string ) {\n\n\tconst shader = gl.createShader( type );\n\n\tgl.shaderSource( shader, string );\n\tgl.compileShader( shader );\n\n\treturn shader;\n\n}\n\n// From https://www.khronos.org/registry/webgl/extensions/KHR_parallel_shader_compile/\nconst COMPLETION_STATUS_KHR = 0x91B1;\n\nlet programIdCount = 0;\n\nfunction handleSource( string, errorLine ) {\n\n\tconst lines = string.split( '\\n' );\n\tconst lines2 = [];\n\n\tconst from = Math.max( errorLine - 6, 0 );\n\tconst to = Math.min( errorLine + 6, lines.length );\n\n\tfor ( let i = from; i < to; i ++ ) {\n\n\t\tconst line = i + 1;\n\t\tlines2.push( `${line === errorLine ? '>' : ' '} ${line}: ${lines[ i ]}` );\n\n\t}\n\n\treturn lines2.join( '\\n' );\n\n}\n\nfunction getEncodingComponents( colorSpace ) {\n\n\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\tconst encodingPrimaries = ColorManagement.getPrimaries( colorSpace );\n\n\tlet gamutMapping;\n\n\tif ( workingPrimaries === encodingPrimaries ) {\n\n\t\tgamutMapping = '';\n\n\t} else if ( workingPrimaries === P3Primaries && encodingPrimaries === Rec709Primaries ) {\n\n\t\tgamutMapping = 'LinearDisplayP3ToLinearSRGB';\n\n\t} else if ( workingPrimaries === Rec709Primaries && encodingPrimaries === P3Primaries ) {\n\n\t\tgamutMapping = 'LinearSRGBToLinearDisplayP3';\n\n\t}\n\n\tswitch ( colorSpace ) {\n\n\t\tcase LinearSRGBColorSpace:\n\t\tcase LinearDisplayP3ColorSpace:\n\t\t\treturn [ gamutMapping, 'LinearTransferOETF' ];\n\n\t\tcase SRGBColorSpace:\n\t\tcase DisplayP3ColorSpace:\n\t\t\treturn [ gamutMapping, 'sRGBTransferOETF' ];\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported color space:', colorSpace );\n\t\t\treturn [ gamutMapping, 'LinearTransferOETF' ];\n\n\t}\n\n}\n\nfunction getShaderErrors( gl, shader, type ) {\n\n\tconst status = gl.getShaderParameter( shader, gl.COMPILE_STATUS );\n\tconst errors = gl.getShaderInfoLog( shader ).trim();\n\n\tif ( status && errors === '' ) return '';\n\n\tconst errorMatches = /ERROR: 0:(\\d+)/.exec( errors );\n\tif ( errorMatches ) {\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// console.log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\tconst errorLine = parseInt( errorMatches[ 1 ] );\n\t\treturn type.toUpperCase() + '\\n\\n' + errors + '\\n\\n' + handleSource( gl.getShaderSource( shader ), errorLine );\n\n\t} else {\n\n\t\treturn errors;\n\n\t}\n\n}\n\nfunction getTexelEncodingFunction( functionName, colorSpace ) {\n\n\tconst components = getEncodingComponents( colorSpace );\n\treturn `vec4 ${functionName}( vec4 value ) { return ${components[ 0 ]}( ${components[ 1 ]}( value ) ); }`;\n\n}\n\nfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\tlet 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 CineonToneMapping:\n\t\t\ttoneMappingName = 'OptimizedCineon';\n\t\t\tbreak;\n\n\t\tcase ACESFilmicToneMapping:\n\t\t\ttoneMappingName = 'ACESFilmic';\n\t\t\tbreak;\n\n\t\tcase CustomToneMapping:\n\t\t\ttoneMappingName = 'Custom';\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported toneMapping:', toneMapping );\n\t\t\ttoneMappingName = 'Linear';\n\n\t}\n\n\treturn 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';\n\n}\n\nfunction generateExtensions( parameters ) {\n\n\tconst chunks = [\n\t\t( parameters.extensionDerivatives || !! parameters.envMapCubeUVHeight || parameters.bumpMap || parameters.normalMapTangentSpace || parameters.clearcoatNormalMap || parameters.flatShading || parameters.shaderID === 'physical' ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t( parameters.extensionFragDepth || parameters.logarithmicDepthBuffer ) && parameters.rendererExtensionFragDepth ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t( parameters.extensionDrawBuffers && parameters.rendererExtensionDrawBuffers ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t( parameters.extensionShaderTextureLOD || parameters.envMap || parameters.transmission ) && parameters.rendererExtensionShaderTextureLod ? '#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\tconst chunks = [];\n\n\tfor ( const name in defines ) {\n\n\t\tconst 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\tconst attributes = {};\n\n\tconst n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\tfor ( let i = 0; i < n; i ++ ) {\n\n\t\tconst info = gl.getActiveAttrib( program, i );\n\t\tconst name = info.name;\n\n\t\tlet locationSize = 1;\n\t\tif ( info.type === gl.FLOAT_MAT2 ) locationSize = 2;\n\t\tif ( info.type === gl.FLOAT_MAT3 ) locationSize = 3;\n\t\tif ( info.type === gl.FLOAT_MAT4 ) locationSize = 4;\n\n\t\t// console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );\n\n\t\tattributes[ name ] = {\n\t\t\ttype: info.type,\n\t\t\tlocation: gl.getAttribLocation( program, name ),\n\t\t\tlocationSize: locationSize\n\t\t};\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\tconst numSpotLightCoords = parameters.numSpotLightShadows + parameters.numSpotLightMaps - parameters.numSpotLightShadowsWithMaps;\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_SPOT_LIGHT_MAPS/g, parameters.numSpotLightMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_COORDS/g, numSpotLightCoords )\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\t\t.replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g, parameters.numSpotLightShadowsWithMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows )\n\t\t.replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows );\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\n// Resolve Includes\n\nconst includePattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n\nfunction resolveIncludes( string ) {\n\n\treturn string.replace( includePattern, includeReplacer );\n\n}\n\nconst shaderChunkMap = new Map( [\n\t[ 'encodings_fragment', 'colorspace_fragment' ], // @deprecated, r154\n\t[ 'encodings_pars_fragment', 'colorspace_pars_fragment' ], // @deprecated, r154\n\t[ 'output_fragment', 'opaque_fragment' ], // @deprecated, r154\n] );\n\nfunction includeReplacer( match, include ) {\n\n\tlet string = ShaderChunk[ include ];\n\n\tif ( string === undefined ) {\n\n\t\tconst newInclude = shaderChunkMap.get( include );\n\n\t\tif ( newInclude !== undefined ) {\n\n\t\t\tstring = ShaderChunk[ newInclude ];\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Shader chunk \"%s\" has been deprecated. Use \"%s\" instead.', include, newInclude );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t}\n\n\t}\n\n\treturn resolveIncludes( string );\n\n}\n\n// Unroll Loops\n\nconst unrollLoopPattern = /#pragma unroll_loop_start\\s+for\\s*\\(\\s*int\\s+i\\s*=\\s*(\\d+)\\s*;\\s*i\\s*<\\s*(\\d+)\\s*;\\s*i\\s*\\+\\+\\s*\\)\\s*{([\\s\\S]+?)}\\s+#pragma unroll_loop_end/g;\n\nfunction unrollLoops( string ) {\n\n\treturn string.replace( unrollLoopPattern, loopReplacer );\n\n}\n\nfunction loopReplacer( match, start, end, snippet ) {\n\n\tlet string = '';\n\n\tfor ( let i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\tstring += snippet\n\t\t\t.replace( /\\[\\s*i\\s*\\]/g, '[ ' + i + ' ]' )\n\t\t\t.replace( /UNROLLED_LOOP_INDEX/g, i );\n\n\t}\n\n\treturn string;\n\n}\n\n//\n\nfunction generatePrecision( parameters ) {\n\n\tlet precisionstring = 'precision ' + parameters.precision + ' float;\\nprecision ' + parameters.precision + ' int;';\n\n\tif ( parameters.precision === 'highp' ) {\n\n\t\tprecisionstring += '\\n#define HIGH_PRECISION';\n\n\t} else if ( parameters.precision === 'mediump' ) {\n\n\t\tprecisionstring += '\\n#define MEDIUM_PRECISION';\n\n\t} else if ( parameters.precision === 'lowp' ) {\n\n\t\tprecisionstring += '\\n#define LOW_PRECISION';\n\n\t}\n\n\treturn precisionstring;\n\n}\n\nfunction generateShadowMapTypeDefine( parameters ) {\n\n\tlet 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} else if ( parameters.shadowMapType === VSMShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_VSM';\n\n\t}\n\n\treturn shadowMapTypeDefine;\n\n}\n\nfunction generateEnvMapTypeDefine( parameters ) {\n\n\tlet envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\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\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapTypeDefine;\n\n}\n\nfunction generateEnvMapModeDefine( parameters ) {\n\n\tlet envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeRefractionMapping:\n\n\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapModeDefine;\n\n}\n\nfunction generateEnvMapBlendingDefine( parameters ) {\n\n\tlet envMapBlendingDefine = 'ENVMAP_BLENDING_NONE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.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\treturn envMapBlendingDefine;\n\n}\n\nfunction generateCubeUVSize( parameters ) {\n\n\tconst imageHeight = parameters.envMapCubeUVHeight;\n\n\tif ( imageHeight === null ) return null;\n\n\tconst maxMip = Math.log2( imageHeight ) - 2;\n\n\tconst texelHeight = 1.0 / imageHeight;\n\n\tconst texelWidth = 1.0 / ( 3 * Math.max( Math.pow( 2, maxMip ), 7 * 16 ) );\n\n\treturn { texelWidth, texelHeight, maxMip };\n\n}\n\nfunction WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {\n\n\t// TODO Send this event to Three.js DevTools\n\t// console.log( 'WebGLProgram', cacheKey );\n\n\tconst gl = renderer.getContext();\n\n\tconst defines = parameters.defines;\n\n\tlet vertexShader = parameters.vertexShader;\n\tlet fragmentShader = parameters.fragmentShader;\n\n\tconst shadowMapTypeDefine = generateShadowMapTypeDefine( parameters );\n\tconst envMapTypeDefine = generateEnvMapTypeDefine( parameters );\n\tconst envMapModeDefine = generateEnvMapModeDefine( parameters );\n\tconst envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );\n\tconst envMapCubeUVSize = generateCubeUVSize( parameters );\n\n\tconst customExtensions = parameters.isWebGL2 ? '' : generateExtensions( parameters );\n\n\tconst customDefines = generateDefines( defines );\n\n\tconst program = gl.createProgram();\n\n\tlet prefixVertex, prefixFragment;\n\tlet versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\\n' : '';\n\n\tif ( parameters.isRawShaderMaterial ) {\n\n\t\tprefixVertex = [\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\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\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\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\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.instancing ? '#define USE_INSTANCING' : '',\n\t\t\tparameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '',\n\n\t\t\tparameters.useFog && parameters.fog ? '#define USE_FOG' : '',\n\t\t\tparameters.useFog && parameters.fogExp2 ? '#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.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',\n\t\t\tparameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',\n\t\t\tparameters.displacementMap ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\n\t\t\tparameters.anisotropy ? '#define USE_ANISOTROPY' : '',\n\t\t\tparameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '',\n\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',\n\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.alphaHash ? '#define USE_ALPHAHASH' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',\n\n\t\t\t//\n\n\t\t\tparameters.mapUv ? '#define MAP_UV ' + parameters.mapUv : '',\n\t\t\tparameters.alphaMapUv ? '#define ALPHAMAP_UV ' + parameters.alphaMapUv : '',\n\t\t\tparameters.lightMapUv ? '#define LIGHTMAP_UV ' + parameters.lightMapUv : '',\n\t\t\tparameters.aoMapUv ? '#define AOMAP_UV ' + parameters.aoMapUv : '',\n\t\t\tparameters.emissiveMapUv ? '#define EMISSIVEMAP_UV ' + parameters.emissiveMapUv : '',\n\t\t\tparameters.bumpMapUv ? '#define BUMPMAP_UV ' + parameters.bumpMapUv : '',\n\t\t\tparameters.normalMapUv ? '#define NORMALMAP_UV ' + parameters.normalMapUv : '',\n\t\t\tparameters.displacementMapUv ? '#define DISPLACEMENTMAP_UV ' + parameters.displacementMapUv : '',\n\n\t\t\tparameters.metalnessMapUv ? '#define METALNESSMAP_UV ' + parameters.metalnessMapUv : '',\n\t\t\tparameters.roughnessMapUv ? '#define ROUGHNESSMAP_UV ' + parameters.roughnessMapUv : '',\n\n\t\t\tparameters.anisotropyMapUv ? '#define ANISOTROPYMAP_UV ' + parameters.anisotropyMapUv : '',\n\n\t\t\tparameters.clearcoatMapUv ? '#define CLEARCOATMAP_UV ' + parameters.clearcoatMapUv : '',\n\t\t\tparameters.clearcoatNormalMapUv ? '#define CLEARCOAT_NORMALMAP_UV ' + parameters.clearcoatNormalMapUv : '',\n\t\t\tparameters.clearcoatRoughnessMapUv ? '#define CLEARCOAT_ROUGHNESSMAP_UV ' + parameters.clearcoatRoughnessMapUv : '',\n\n\t\t\tparameters.iridescenceMapUv ? '#define IRIDESCENCEMAP_UV ' + parameters.iridescenceMapUv : '',\n\t\t\tparameters.iridescenceThicknessMapUv ? '#define IRIDESCENCE_THICKNESSMAP_UV ' + parameters.iridescenceThicknessMapUv : '',\n\n\t\t\tparameters.sheenColorMapUv ? '#define SHEEN_COLORMAP_UV ' + parameters.sheenColorMapUv : '',\n\t\t\tparameters.sheenRoughnessMapUv ? '#define SHEEN_ROUGHNESSMAP_UV ' + parameters.sheenRoughnessMapUv : '',\n\n\t\t\tparameters.specularMapUv ? '#define SPECULARMAP_UV ' + parameters.specularMapUv : '',\n\t\t\tparameters.specularColorMapUv ? '#define SPECULAR_COLORMAP_UV ' + parameters.specularColorMapUv : '',\n\t\t\tparameters.specularIntensityMapUv ? '#define SPECULAR_INTENSITYMAP_UV ' + parameters.specularIntensityMapUv : '',\n\n\t\t\tparameters.transmissionMapUv ? '#define TRANSMISSIONMAP_UV ' + parameters.transmissionMapUv : '',\n\t\t\tparameters.thicknessMapUv ? '#define THICKNESSMAP_UV ' + parameters.thicknessMapUv : '',\n\n\t\t\t//\n\n\t\t\tparameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUv1s ? '#define USE_UV1' : '',\n\t\t\tparameters.vertexUv2s ? '#define USE_UV2' : '',\n\t\t\tparameters.vertexUv3s ? '#define USE_UV3' : '',\n\n\t\t\tparameters.pointsUvs ? '#define USE_POINTS_UV' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\n\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t( parameters.morphColors && parameters.isWebGL2 ) ? '#define USE_MORPHCOLORS' : '',\n\t\t\t( parameters.morphTargetsCount > 0 && parameters.isWebGL2 ) ? '#define MORPHTARGETS_TEXTURE' : '',\n\t\t\t( parameters.morphTargetsCount > 0 && parameters.isWebGL2 ) ? '#define MORPHTARGETS_TEXTURE_STRIDE ' + parameters.morphTextureStride : '',\n\t\t\t( parameters.morphTargetsCount > 0 && parameters.isWebGL2 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '',\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.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',\n\n\t\t\tparameters.useLegacyLights ? '#define LEGACY_LIGHTS' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#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\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t'#ifdef USE_INSTANCING',\n\n\t\t\t'\tattribute mat4 instanceMatrix;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_COLOR',\n\n\t\t\t'\tattribute vec3 instanceColor;',\n\n\t\t\t'#endif',\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_UV1',\n\n\t\t\t'\tattribute vec2 uv1;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_UV2',\n\n\t\t\t'\tattribute vec2 uv2;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_UV3',\n\n\t\t\t'\tattribute vec2 uv3;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_TANGENT',\n\n\t\t\t'\tattribute vec4 tangent;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if defined( USE_COLOR_ALPHA )',\n\n\t\t\t'\tattribute vec4 color;',\n\n\t\t\t'#elif defined( USE_COLOR )',\n\n\t\t\t'\tattribute vec3 color;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )',\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\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.useFog && parameters.fog ? '#define USE_FOG' : '',\n\t\t\tparameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.matcap ? '#define USE_MATCAP' : '',\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\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_WIDTH ' + envMapCubeUVSize.texelWidth : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_HEIGHT ' + envMapCubeUVSize.texelHeight : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_MAX_MIP ' + envMapCubeUVSize.maxMip + '.0' : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',\n\t\t\tparameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\n\t\t\tparameters.anisotropy ? '#define USE_ANISOTROPY' : '',\n\t\t\tparameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '',\n\n\t\t\tparameters.clearcoat ? '#define USE_CLEARCOAT' : '',\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.iridescence ? '#define USE_IRIDESCENCE' : '',\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaTest ? '#define USE_ALPHATEST' : '',\n\t\t\tparameters.alphaHash ? '#define USE_ALPHAHASH' : '',\n\n\t\t\tparameters.sheen ? '#define USE_SHEEN' : '',\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors || parameters.instancingColor ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUv1s ? '#define USE_UV1' : '',\n\t\t\tparameters.vertexUv2s ? '#define USE_UV2' : '',\n\t\t\tparameters.vertexUv3s ? '#define USE_UV3' : '',\n\n\t\t\tparameters.pointsUvs ? '#define USE_POINTS_UV' : '',\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.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',\n\n\t\t\tparameters.useLegacyLights ? '#define LEGACY_LIGHTS' : '',\n\n\t\t\tparameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\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\t\t\tparameters.opaque ? '#define OPAQUE' : '',\n\n\t\t\tShaderChunk[ 'colorspace_pars_fragment' ], // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\tgetTexelEncodingFunction( 'linearToOutputTexel', parameters.outputColorSpace ),\n\n\t\t\tparameters.useDepthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tvertexShader = resolveIncludes( vertexShader );\n\tvertexShader = replaceLightNums( vertexShader, parameters );\n\tvertexShader = replaceClippingPlaneNums( vertexShader, parameters );\n\n\tfragmentShader = resolveIncludes( fragmentShader );\n\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\tfragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );\n\n\tvertexShader = unrollLoops( vertexShader );\n\tfragmentShader = unrollLoops( fragmentShader );\n\n\tif ( parameters.isWebGL2 && parameters.isRawShaderMaterial !== true ) {\n\n\t\t// GLSL 3.0 conversion for built-in materials and ShaderMaterial\n\n\t\tversionString = '#version 300 es\\n';\n\n\t\tprefixVertex = [\n\t\t\t'precision mediump sampler2DArray;',\n\t\t\t'#define attribute in',\n\t\t\t'#define varying out',\n\t\t\t'#define texture2D texture'\n\t\t].join( '\\n' ) + '\\n' + prefixVertex;\n\n\t\tprefixFragment = [\n\t\t\t'precision mediump sampler2DArray;',\n\t\t\t'#define varying in',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor',\n\t\t\t'#define gl_FragDepthEXT gl_FragDepth',\n\t\t\t'#define texture2D texture',\n\t\t\t'#define textureCube texture',\n\t\t\t'#define texture2DProj textureProj',\n\t\t\t'#define texture2DLodEXT textureLod',\n\t\t\t'#define texture2DProjLodEXT textureProjLod',\n\t\t\t'#define textureCubeLodEXT textureLod',\n\t\t\t'#define texture2DGradEXT textureGrad',\n\t\t\t'#define texture2DProjGradEXT textureProjGrad',\n\t\t\t'#define textureCubeGradEXT textureGrad'\n\t\t].join( '\\n' ) + '\\n' + prefixFragment;\n\n\t}\n\n\tconst vertexGlsl = versionString + prefixVertex + vertexShader;\n\tconst fragmentGlsl = versionString + prefixFragment + fragmentShader;\n\n\t// console.log( '*VERTEX*', vertexGlsl );\n\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\tconst glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\tconst 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 ( parameters.index0AttributeName !== undefined ) {\n\n\t\tgl.bindAttribLocation( program, 0, parameters.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\tfunction onFirstUse( self ) {\n\n\t\t// check for link errors\n\t\tif ( renderer.debug.checkShaderErrors ) {\n\n\t\t\tconst programLog = gl.getProgramInfoLog( program ).trim();\n\t\t\tconst vertexLog = gl.getShaderInfoLog( glVertexShader ).trim();\n\t\t\tconst fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim();\n\n\t\t\tlet runnable = true;\n\t\t\tlet haveDiagnostics = true;\n\n\t\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\t\trunnable = false;\n\n\t\t\t\tif ( typeof renderer.debug.onShaderError === 'function' ) {\n\n\t\t\t\t\trenderer.debug.onShaderError( gl, program, glVertexShader, glFragmentShader );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// default error reporting\n\n\t\t\t\t\tconst vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );\n\t\t\t\t\tconst fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );\n\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +\n\t\t\t\t\t\t'VALIDATE_STATUS ' + gl.getProgramParameter( program, gl.VALIDATE_STATUS ) + '\\n\\n' +\n\t\t\t\t\t\t'Program Info Log: ' + programLog + '\\n' +\n\t\t\t\t\t\tvertexErrors + '\\n' +\n\t\t\t\t\t\tfragmentErrors\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t} else if ( programLog !== '' ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLProgram: Program Info Log:', programLog );\n\n\t\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\t\thaveDiagnostics = false;\n\n\t\t\t}\n\n\t\t\tif ( haveDiagnostics ) {\n\n\t\t\t\tself.diagnostics = {\n\n\t\t\t\t\trunnable: runnable,\n\n\t\t\t\t\tprogramLog: programLog,\n\n\t\t\t\t\tvertexShader: {\n\n\t\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t\t},\n\n\t\t\t\t\tfragmentShader: {\n\n\t\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\t\tprefix: prefixFragment\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// Clean up\n\n\t\t// Crashes in iOS9 and iOS10. #18402\n\t\t// gl.detachShader( program, glVertexShader );\n\t\t// gl.detachShader( program, glFragmentShader );\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\tcachedUniforms = new WebGLUniforms( gl, program );\n\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t}\n\n\t// set up caching for uniform locations\n\n\tlet cachedUniforms;\n\n\tthis.getUniforms = function () {\n\n\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t// Populates cachedUniforms and cachedAttributes\n\t\t\tonFirstUse( this );\n\n\t\t}\n\n\t\treturn cachedUniforms;\n\n\t};\n\n\t// set up caching for attribute locations\n\n\tlet cachedAttributes;\n\n\tthis.getAttributes = function () {\n\n\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t// Populates cachedAttributes and cachedUniforms\n\t\t\tonFirstUse( this );\n\n\t\t}\n\n\t\treturn cachedAttributes;\n\n\t};\n\n\t// indicate when the program is ready to be used. if the KHR_parallel_shader_compile extension isn't supported,\n\t// flag the program as ready immediately. It may cause a stall when it's first used.\n\n\tlet programReady = ( parameters.rendererExtensionParallelShaderCompile === false );\n\n\tthis.isReady = function () {\n\n\t\tif ( programReady === false ) {\n\n\t\t\tprogramReady = gl.getProgramParameter( program, COMPLETION_STATUS_KHR );\n\n\t\t}\n\n\t\treturn programReady;\n\n\t};\n\n\t// free resource\n\n\tthis.destroy = function () {\n\n\t\tbindingStates.releaseStatesOfProgram( this );\n\n\t\tgl.deleteProgram( program );\n\t\tthis.program = undefined;\n\n\t};\n\n\t//\n\n\tthis.type = parameters.shaderType;\n\tthis.name = parameters.shaderName;\n\tthis.id = programIdCount ++;\n\tthis.cacheKey = cacheKey;\n\tthis.usedTimes = 1;\n\tthis.program = program;\n\tthis.vertexShader = glVertexShader;\n\tthis.fragmentShader = glFragmentShader;\n\n\treturn this;\n\n}\n\nlet _id$1 = 0;\n\nclass WebGLShaderCache {\n\n\tconstructor() {\n\n\t\tthis.shaderCache = new Map();\n\t\tthis.materialCache = new Map();\n\n\t}\n\n\tupdate( material ) {\n\n\t\tconst vertexShader = material.vertexShader;\n\t\tconst fragmentShader = material.fragmentShader;\n\n\t\tconst vertexShaderStage = this._getShaderStage( vertexShader );\n\t\tconst fragmentShaderStage = this._getShaderStage( fragmentShader );\n\n\t\tconst materialShaders = this._getShaderCacheForMaterial( material );\n\n\t\tif ( materialShaders.has( vertexShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( vertexShaderStage );\n\t\t\tvertexShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\tif ( materialShaders.has( fragmentShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( fragmentShaderStage );\n\t\t\tfragmentShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( material ) {\n\n\t\tconst materialShaders = this.materialCache.get( material );\n\n\t\tfor ( const shaderStage of materialShaders ) {\n\n\t\t\tshaderStage.usedTimes --;\n\n\t\t\tif ( shaderStage.usedTimes === 0 ) this.shaderCache.delete( shaderStage.code );\n\n\t\t}\n\n\t\tthis.materialCache.delete( material );\n\n\t\treturn this;\n\n\t}\n\n\tgetVertexShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.vertexShader ).id;\n\n\t}\n\n\tgetFragmentShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.fragmentShader ).id;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shaderCache.clear();\n\t\tthis.materialCache.clear();\n\n\t}\n\n\t_getShaderCacheForMaterial( material ) {\n\n\t\tconst cache = this.materialCache;\n\t\tlet set = cache.get( material );\n\n\t\tif ( set === undefined ) {\n\n\t\t\tset = new Set();\n\t\t\tcache.set( material, set );\n\n\t\t}\n\n\t\treturn set;\n\n\t}\n\n\t_getShaderStage( code ) {\n\n\t\tconst cache = this.shaderCache;\n\t\tlet stage = cache.get( code );\n\n\t\tif ( stage === undefined ) {\n\n\t\t\tstage = new WebGLShaderStage( code );\n\t\t\tcache.set( code, stage );\n\n\t\t}\n\n\t\treturn stage;\n\n\t}\n\n}\n\nclass WebGLShaderStage {\n\n\tconstructor( code ) {\n\n\t\tthis.id = _id$1 ++;\n\n\t\tthis.code = code;\n\t\tthis.usedTimes = 0;\n\n\t}\n\n}\n\nfunction WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) {\n\n\tconst _programLayers = new Layers();\n\tconst _customShaders = new WebGLShaderCache();\n\tconst programs = [];\n\n\tconst IS_WEBGL2 = capabilities.isWebGL2;\n\tconst logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;\n\tconst SUPPORTS_VERTEX_TEXTURES = capabilities.vertexTextures;\n\n\tlet precision = capabilities.precision;\n\n\tconst 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: 'toon',\n\t\tMeshStandardMaterial: 'physical',\n\t\tMeshPhysicalMaterial: 'physical',\n\t\tMeshMatcapMaterial: 'matcap',\n\t\tLineBasicMaterial: 'basic',\n\t\tLineDashedMaterial: 'dashed',\n\t\tPointsMaterial: 'points',\n\t\tShadowMaterial: 'shadow',\n\t\tSpriteMaterial: 'sprite'\n\t};\n\n\tfunction getChannel( value ) {\n\n\t\tif ( value === 0 ) return 'uv';\n\n\t\treturn `uv${ value }`;\n\n\t}\n\n\tfunction getParameters( material, lights, shadows, scene, object ) {\n\n\t\tconst fog = scene.fog;\n\t\tconst geometry = object.geometry;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\tconst envMapCubeUVHeight = ( !! envMap ) && ( envMap.mapping === CubeUVReflectionMapping ) ? envMap.image.height : null;\n\n\t\tconst 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\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\t//\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet morphTextureStride = 0;\n\n\t\tif ( geometry.morphAttributes.position !== undefined ) morphTextureStride = 1;\n\t\tif ( geometry.morphAttributes.normal !== undefined ) morphTextureStride = 2;\n\t\tif ( geometry.morphAttributes.color !== undefined ) morphTextureStride = 3;\n\n\t\t//\n\n\t\tlet vertexShader, fragmentShader;\n\t\tlet customVertexShaderID, customFragmentShaderID;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\n\t\t\tvertexShader = shader.vertexShader;\n\t\t\tfragmentShader = shader.fragmentShader;\n\n\t\t} else {\n\n\t\t\tvertexShader = material.vertexShader;\n\t\t\tfragmentShader = material.fragmentShader;\n\n\t\t\t_customShaders.update( material );\n\n\t\t\tcustomVertexShaderID = _customShaders.getVertexShaderID( material );\n\t\t\tcustomFragmentShaderID = _customShaders.getFragmentShaderID( material );\n\n\t\t}\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tconst IS_INSTANCEDMESH = object.isInstancedMesh === true;\n\n\t\tconst HAS_MAP = !! material.map;\n\t\tconst HAS_MATCAP = !! material.matcap;\n\t\tconst HAS_ENVMAP = !! envMap;\n\t\tconst HAS_AOMAP = !! material.aoMap;\n\t\tconst HAS_LIGHTMAP = !! material.lightMap;\n\t\tconst HAS_BUMPMAP = !! material.bumpMap;\n\t\tconst HAS_NORMALMAP = !! material.normalMap;\n\t\tconst HAS_DISPLACEMENTMAP = !! material.displacementMap;\n\t\tconst HAS_EMISSIVEMAP = !! material.emissiveMap;\n\n\t\tconst HAS_METALNESSMAP = !! material.metalnessMap;\n\t\tconst HAS_ROUGHNESSMAP = !! material.roughnessMap;\n\n\t\tconst HAS_ANISOTROPY = material.anisotropy > 0;\n\t\tconst HAS_CLEARCOAT = material.clearcoat > 0;\n\t\tconst HAS_IRIDESCENCE = material.iridescence > 0;\n\t\tconst HAS_SHEEN = material.sheen > 0;\n\t\tconst HAS_TRANSMISSION = material.transmission > 0;\n\n\t\tconst HAS_ANISOTROPYMAP = HAS_ANISOTROPY && !! material.anisotropyMap;\n\n\t\tconst HAS_CLEARCOATMAP = HAS_CLEARCOAT && !! material.clearcoatMap;\n\t\tconst HAS_CLEARCOAT_NORMALMAP = HAS_CLEARCOAT && !! material.clearcoatNormalMap;\n\t\tconst HAS_CLEARCOAT_ROUGHNESSMAP = HAS_CLEARCOAT && !! material.clearcoatRoughnessMap;\n\n\t\tconst HAS_IRIDESCENCEMAP = HAS_IRIDESCENCE && !! material.iridescenceMap;\n\t\tconst HAS_IRIDESCENCE_THICKNESSMAP = HAS_IRIDESCENCE && !! material.iridescenceThicknessMap;\n\n\t\tconst HAS_SHEEN_COLORMAP = HAS_SHEEN && !! material.sheenColorMap;\n\t\tconst HAS_SHEEN_ROUGHNESSMAP = HAS_SHEEN && !! material.sheenRoughnessMap;\n\n\t\tconst HAS_SPECULARMAP = !! material.specularMap;\n\t\tconst HAS_SPECULAR_COLORMAP = !! material.specularColorMap;\n\t\tconst HAS_SPECULAR_INTENSITYMAP = !! material.specularIntensityMap;\n\n\t\tconst HAS_TRANSMISSIONMAP = HAS_TRANSMISSION && !! material.transmissionMap;\n\t\tconst HAS_THICKNESSMAP = HAS_TRANSMISSION && !! material.thicknessMap;\n\n\t\tconst HAS_GRADIENTMAP = !! material.gradientMap;\n\n\t\tconst HAS_ALPHAMAP = !! material.alphaMap;\n\n\t\tconst HAS_ALPHATEST = material.alphaTest > 0;\n\n\t\tconst HAS_ALPHAHASH = !! material.alphaHash;\n\n\t\tconst HAS_EXTENSIONS = !! material.extensions;\n\n\t\tconst HAS_ATTRIBUTE_UV1 = !! geometry.attributes.uv1;\n\t\tconst HAS_ATTRIBUTE_UV2 = !! geometry.attributes.uv2;\n\t\tconst HAS_ATTRIBUTE_UV3 = !! geometry.attributes.uv3;\n\n\t\tlet toneMapping = NoToneMapping;\n\n\t\tif ( material.toneMapped ) {\n\n\t\t\tif ( currentRenderTarget === null || currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\t\t\ttoneMapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst parameters = {\n\n\t\t\tisWebGL2: IS_WEBGL2,\n\n\t\t\tshaderID: shaderID,\n\t\t\tshaderType: material.type,\n\t\t\tshaderName: material.name,\n\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader,\n\t\t\tdefines: material.defines,\n\n\t\t\tcustomVertexShaderID: customVertexShaderID,\n\t\t\tcustomFragmentShaderID: customFragmentShaderID,\n\n\t\t\tisRawShaderMaterial: material.isRawShaderMaterial === true,\n\t\t\tglslVersion: material.glslVersion,\n\n\t\t\tprecision: precision,\n\n\t\t\tinstancing: IS_INSTANCEDMESH,\n\t\t\tinstancingColor: IS_INSTANCEDMESH && object.instanceColor !== null,\n\n\t\t\tsupportsVertexTextures: SUPPORTS_VERTEX_TEXTURES,\n\t\t\toutputColorSpace: ( currentRenderTarget === null ) ? renderer.outputColorSpace : ( currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace ),\n\n\t\t\tmap: HAS_MAP,\n\t\t\tmatcap: HAS_MATCAP,\n\t\t\tenvMap: HAS_ENVMAP,\n\t\t\tenvMapMode: HAS_ENVMAP && envMap.mapping,\n\t\t\tenvMapCubeUVHeight: envMapCubeUVHeight,\n\t\t\taoMap: HAS_AOMAP,\n\t\t\tlightMap: HAS_LIGHTMAP,\n\t\t\tbumpMap: HAS_BUMPMAP,\n\t\t\tnormalMap: HAS_NORMALMAP,\n\t\t\tdisplacementMap: SUPPORTS_VERTEX_TEXTURES && HAS_DISPLACEMENTMAP,\n\t\t\temissiveMap: HAS_EMISSIVEMAP,\n\n\t\t\tnormalMapObjectSpace: HAS_NORMALMAP && material.normalMapType === ObjectSpaceNormalMap,\n\t\t\tnormalMapTangentSpace: HAS_NORMALMAP && material.normalMapType === TangentSpaceNormalMap,\n\n\t\t\tmetalnessMap: HAS_METALNESSMAP,\n\t\t\troughnessMap: HAS_ROUGHNESSMAP,\n\n\t\t\tanisotropy: HAS_ANISOTROPY,\n\t\t\tanisotropyMap: HAS_ANISOTROPYMAP,\n\n\t\t\tclearcoat: HAS_CLEARCOAT,\n\t\t\tclearcoatMap: HAS_CLEARCOATMAP,\n\t\t\tclearcoatNormalMap: HAS_CLEARCOAT_NORMALMAP,\n\t\t\tclearcoatRoughnessMap: HAS_CLEARCOAT_ROUGHNESSMAP,\n\n\t\t\tiridescence: HAS_IRIDESCENCE,\n\t\t\tiridescenceMap: HAS_IRIDESCENCEMAP,\n\t\t\tiridescenceThicknessMap: HAS_IRIDESCENCE_THICKNESSMAP,\n\n\t\t\tsheen: HAS_SHEEN,\n\t\t\tsheenColorMap: HAS_SHEEN_COLORMAP,\n\t\t\tsheenRoughnessMap: HAS_SHEEN_ROUGHNESSMAP,\n\n\t\t\tspecularMap: HAS_SPECULARMAP,\n\t\t\tspecularColorMap: HAS_SPECULAR_COLORMAP,\n\t\t\tspecularIntensityMap: HAS_SPECULAR_INTENSITYMAP,\n\n\t\t\ttransmission: HAS_TRANSMISSION,\n\t\t\ttransmissionMap: HAS_TRANSMISSIONMAP,\n\t\t\tthicknessMap: HAS_THICKNESSMAP,\n\n\t\t\tgradientMap: HAS_GRADIENTMAP,\n\n\t\t\topaque: material.transparent === false && material.blending === NormalBlending,\n\n\t\t\talphaMap: HAS_ALPHAMAP,\n\t\t\talphaTest: HAS_ALPHATEST,\n\t\t\talphaHash: HAS_ALPHAHASH,\n\n\t\t\tcombine: material.combine,\n\n\t\t\t//\n\n\t\t\tmapUv: HAS_MAP && getChannel( material.map.channel ),\n\t\t\taoMapUv: HAS_AOMAP && getChannel( material.aoMap.channel ),\n\t\t\tlightMapUv: HAS_LIGHTMAP && getChannel( material.lightMap.channel ),\n\t\t\tbumpMapUv: HAS_BUMPMAP && getChannel( material.bumpMap.channel ),\n\t\t\tnormalMapUv: HAS_NORMALMAP && getChannel( material.normalMap.channel ),\n\t\t\tdisplacementMapUv: HAS_DISPLACEMENTMAP && getChannel( material.displacementMap.channel ),\n\t\t\temissiveMapUv: HAS_EMISSIVEMAP && getChannel( material.emissiveMap.channel ),\n\n\t\t\tmetalnessMapUv: HAS_METALNESSMAP && getChannel( material.metalnessMap.channel ),\n\t\t\troughnessMapUv: HAS_ROUGHNESSMAP && getChannel( material.roughnessMap.channel ),\n\n\t\t\tanisotropyMapUv: HAS_ANISOTROPYMAP && getChannel( material.anisotropyMap.channel ),\n\n\t\t\tclearcoatMapUv: HAS_CLEARCOATMAP && getChannel( material.clearcoatMap.channel ),\n\t\t\tclearcoatNormalMapUv: HAS_CLEARCOAT_NORMALMAP && getChannel( material.clearcoatNormalMap.channel ),\n\t\t\tclearcoatRoughnessMapUv: HAS_CLEARCOAT_ROUGHNESSMAP && getChannel( material.clearcoatRoughnessMap.channel ),\n\n\t\t\tiridescenceMapUv: HAS_IRIDESCENCEMAP && getChannel( material.iridescenceMap.channel ),\n\t\t\tiridescenceThicknessMapUv: HAS_IRIDESCENCE_THICKNESSMAP && getChannel( material.iridescenceThicknessMap.channel ),\n\n\t\t\tsheenColorMapUv: HAS_SHEEN_COLORMAP && getChannel( material.sheenColorMap.channel ),\n\t\t\tsheenRoughnessMapUv: HAS_SHEEN_ROUGHNESSMAP && getChannel( material.sheenRoughnessMap.channel ),\n\n\t\t\tspecularMapUv: HAS_SPECULARMAP && getChannel( material.specularMap.channel ),\n\t\t\tspecularColorMapUv: HAS_SPECULAR_COLORMAP && getChannel( material.specularColorMap.channel ),\n\t\t\tspecularIntensityMapUv: HAS_SPECULAR_INTENSITYMAP && getChannel( material.specularIntensityMap.channel ),\n\n\t\t\ttransmissionMapUv: HAS_TRANSMISSIONMAP && getChannel( material.transmissionMap.channel ),\n\t\t\tthicknessMapUv: HAS_THICKNESSMAP && getChannel( material.thicknessMap.channel ),\n\n\t\t\talphaMapUv: HAS_ALPHAMAP && getChannel( material.alphaMap.channel ),\n\n\t\t\t//\n\n\t\t\tvertexTangents: !! geometry.attributes.tangent && ( HAS_NORMALMAP || HAS_ANISOTROPY ),\n\t\t\tvertexColors: material.vertexColors,\n\t\t\tvertexAlphas: material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4,\n\t\t\tvertexUv1s: HAS_ATTRIBUTE_UV1,\n\t\t\tvertexUv2s: HAS_ATTRIBUTE_UV2,\n\t\t\tvertexUv3s: HAS_ATTRIBUTE_UV3,\n\n\t\t\tpointsUvs: object.isPoints === true && !! geometry.attributes.uv && ( HAS_MAP || HAS_ALPHAMAP ),\n\n\t\t\tfog: !! fog,\n\t\t\tuseFog: material.fog === true,\n\t\t\tfogExp2: ( fog && fog.isFogExp2 ),\n\n\t\t\tflatShading: material.flatShading === true,\n\n\t\t\tsizeAttenuation: material.sizeAttenuation === true,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tskinning: object.isSkinnedMesh === true,\n\n\t\t\tmorphTargets: geometry.morphAttributes.position !== undefined,\n\t\t\tmorphNormals: geometry.morphAttributes.normal !== undefined,\n\t\t\tmorphColors: geometry.morphAttributes.color !== undefined,\n\t\t\tmorphTargetsCount: morphTargetsCount,\n\t\t\tmorphTextureStride: morphTextureStride,\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\tnumSpotLightMaps: lights.spotLightMap.length,\n\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\tnumDirLightShadows: lights.directionalShadowMap.length,\n\t\t\tnumPointLightShadows: lights.pointShadowMap.length,\n\t\t\tnumSpotLightShadows: lights.spotShadowMap.length,\n\t\t\tnumSpotLightShadowsWithMaps: lights.numSpotLightShadowsWithMaps,\n\n\t\t\tnumLightProbes: lights.numLightProbes,\n\n\t\t\tnumClippingPlanes: clipping.numPlanes,\n\t\t\tnumClipIntersection: clipping.numIntersection,\n\n\t\t\tdithering: material.dithering,\n\n\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0,\n\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\ttoneMapping: toneMapping,\n\t\t\tuseLegacyLights: renderer._useLegacyLights,\n\n\t\t\tdecodeVideoTexture: HAS_MAP && ( material.map.isVideoTexture === true ) && ( ColorManagement.getTransfer( material.map.colorSpace ) === SRGBTransfer ),\n\n\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\tflipSided: material.side === BackSide,\n\n\t\t\tuseDepthPacking: material.depthPacking >= 0,\n\t\t\tdepthPacking: material.depthPacking || 0,\n\n\t\t\tindex0AttributeName: material.index0AttributeName,\n\n\t\t\textensionDerivatives: HAS_EXTENSIONS && material.extensions.derivatives === true,\n\t\t\textensionFragDepth: HAS_EXTENSIONS && material.extensions.fragDepth === true,\n\t\t\textensionDrawBuffers: HAS_EXTENSIONS && material.extensions.drawBuffers === true,\n\t\t\textensionShaderTextureLOD: HAS_EXTENSIONS && material.extensions.shaderTextureLOD === true,\n\n\t\t\trendererExtensionFragDepth: IS_WEBGL2 || extensions.has( 'EXT_frag_depth' ),\n\t\t\trendererExtensionDrawBuffers: IS_WEBGL2 || extensions.has( 'WEBGL_draw_buffers' ),\n\t\t\trendererExtensionShaderTextureLod: IS_WEBGL2 || extensions.has( 'EXT_shader_texture_lod' ),\n\t\t\trendererExtensionParallelShaderCompile: extensions.has( 'KHR_parallel_shader_compile' ),\n\n\t\t\tcustomProgramCacheKey: material.customProgramCacheKey()\n\n\t\t};\n\n\t\treturn parameters;\n\n\t}\n\n\tfunction getProgramCacheKey( parameters ) {\n\n\t\tconst 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( parameters.customVertexShaderID );\n\t\t\tarray.push( parameters.customFragmentShaderID );\n\n\t\t}\n\n\t\tif ( parameters.defines !== undefined ) {\n\n\t\t\tfor ( const name in parameters.defines ) {\n\n\t\t\t\tarray.push( name );\n\t\t\t\tarray.push( parameters.defines[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parameters.isRawShaderMaterial === false ) {\n\n\t\t\tgetProgramCacheKeyParameters( array, parameters );\n\t\t\tgetProgramCacheKeyBooleans( array, parameters );\n\t\t\tarray.push( renderer.outputColorSpace );\n\n\t\t}\n\n\t\tarray.push( parameters.customProgramCacheKey );\n\n\t\treturn array.join();\n\n\t}\n\n\tfunction getProgramCacheKeyParameters( array, parameters ) {\n\n\t\tarray.push( parameters.precision );\n\t\tarray.push( parameters.outputColorSpace );\n\t\tarray.push( parameters.envMapMode );\n\t\tarray.push( parameters.envMapCubeUVHeight );\n\t\tarray.push( parameters.mapUv );\n\t\tarray.push( parameters.alphaMapUv );\n\t\tarray.push( parameters.lightMapUv );\n\t\tarray.push( parameters.aoMapUv );\n\t\tarray.push( parameters.bumpMapUv );\n\t\tarray.push( parameters.normalMapUv );\n\t\tarray.push( parameters.displacementMapUv );\n\t\tarray.push( parameters.emissiveMapUv );\n\t\tarray.push( parameters.metalnessMapUv );\n\t\tarray.push( parameters.roughnessMapUv );\n\t\tarray.push( parameters.anisotropyMapUv );\n\t\tarray.push( parameters.clearcoatMapUv );\n\t\tarray.push( parameters.clearcoatNormalMapUv );\n\t\tarray.push( parameters.clearcoatRoughnessMapUv );\n\t\tarray.push( parameters.iridescenceMapUv );\n\t\tarray.push( parameters.iridescenceThicknessMapUv );\n\t\tarray.push( parameters.sheenColorMapUv );\n\t\tarray.push( parameters.sheenRoughnessMapUv );\n\t\tarray.push( parameters.specularMapUv );\n\t\tarray.push( parameters.specularColorMapUv );\n\t\tarray.push( parameters.specularIntensityMapUv );\n\t\tarray.push( parameters.transmissionMapUv );\n\t\tarray.push( parameters.thicknessMapUv );\n\t\tarray.push( parameters.combine );\n\t\tarray.push( parameters.fogExp2 );\n\t\tarray.push( parameters.sizeAttenuation );\n\t\tarray.push( parameters.morphTargetsCount );\n\t\tarray.push( parameters.morphAttributeCount );\n\t\tarray.push( parameters.numDirLights );\n\t\tarray.push( parameters.numPointLights );\n\t\tarray.push( parameters.numSpotLights );\n\t\tarray.push( parameters.numSpotLightMaps );\n\t\tarray.push( parameters.numHemiLights );\n\t\tarray.push( parameters.numRectAreaLights );\n\t\tarray.push( parameters.numDirLightShadows );\n\t\tarray.push( parameters.numPointLightShadows );\n\t\tarray.push( parameters.numSpotLightShadows );\n\t\tarray.push( parameters.numSpotLightShadowsWithMaps );\n\t\tarray.push( parameters.numLightProbes );\n\t\tarray.push( parameters.shadowMapType );\n\t\tarray.push( parameters.toneMapping );\n\t\tarray.push( parameters.numClippingPlanes );\n\t\tarray.push( parameters.numClipIntersection );\n\t\tarray.push( parameters.depthPacking );\n\n\t}\n\n\tfunction getProgramCacheKeyBooleans( array, parameters ) {\n\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.isWebGL2 )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.supportsVertexTextures )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.instancing )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.instancingColor )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.matcap )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.envMap )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.normalMapObjectSpace )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.normalMapTangentSpace )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.clearcoat )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.iridescence )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.alphaTest )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.vertexColors )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.vertexAlphas )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.vertexUv1s )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.vertexUv2s )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.vertexUv3s )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.vertexTangents )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.anisotropy )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.alphaHash )\n\t\t\t_programLayers.enable( 18 );\n\n\t\tarray.push( _programLayers.mask );\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.fog )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.useFog )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.flatShading )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.logarithmicDepthBuffer )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.skinning )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.morphTargets )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.morphNormals )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.morphColors )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.premultipliedAlpha )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.shadowMapEnabled )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.useLegacyLights )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.doubleSided )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.flipSided )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.useDepthPacking )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.dithering )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.transmission )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.sheen )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.opaque )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.pointsUvs )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.decodeVideoTexture )\n\t\t\t_programLayers.enable( 19 );\n\n\t\tarray.push( _programLayers.mask );\n\n\t}\n\n\tfunction getUniforms( material ) {\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\t\tlet uniforms;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\t\t\tuniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t} else {\n\n\t\t\tuniforms = material.uniforms;\n\n\t\t}\n\n\t\treturn uniforms;\n\n\t}\n\n\tfunction acquireProgram( parameters, cacheKey ) {\n\n\t\tlet program;\n\n\t\t// Check if code has been already compiled\n\t\tfor ( let p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\tconst preexistingProgram = programs[ p ];\n\n\t\t\tif ( preexistingProgram.cacheKey === cacheKey ) {\n\n\t\t\t\tprogram = preexistingProgram;\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, cacheKey, parameters, bindingStates );\n\t\t\tprograms.push( program );\n\n\t\t}\n\n\t\treturn program;\n\n\t}\n\n\tfunction releaseProgram( program ) {\n\n\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t// Remove from unordered set\n\t\t\tconst 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\tfunction releaseShaderCache( material ) {\n\n\t\t_customShaders.remove( material );\n\n\t}\n\n\tfunction dispose() {\n\n\t\t_customShaders.dispose();\n\n\t}\n\n\treturn {\n\t\tgetParameters: getParameters,\n\t\tgetProgramCacheKey: getProgramCacheKey,\n\t\tgetUniforms: getUniforms,\n\t\tacquireProgram: acquireProgram,\n\t\treleaseProgram: releaseProgram,\n\t\treleaseShaderCache: releaseShaderCache,\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tprograms: programs,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLProperties() {\n\n\tlet properties = new WeakMap();\n\n\tfunction get( object ) {\n\n\t\tlet 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\nfunction painterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\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.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else 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\n\nfunction WebGLRenderList() {\n\n\tconst renderItems = [];\n\tlet renderItemsIndex = 0;\n\n\tconst opaque = [];\n\tconst transmissive = [];\n\tconst transparent = [];\n\n\tfunction init() {\n\n\t\trenderItemsIndex = 0;\n\n\t\topaque.length = 0;\n\t\ttransmissive.length = 0;\n\t\ttransparent.length = 0;\n\n\t}\n\n\tfunction getNextRenderItem( object, geometry, material, groupOrder, z, group ) {\n\n\t\tlet 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\tgroupOrder: groupOrder,\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.groupOrder = groupOrder;\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\trenderItemsIndex ++;\n\n\t\treturn renderItem;\n\n\t}\n\n\tfunction push( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.push( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.push( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.push( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction unshift( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.unshift( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.unshift( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.unshift( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction sort( customOpaqueSort, customTransparentSort ) {\n\n\t\tif ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable );\n\t\tif ( transmissive.length > 1 ) transmissive.sort( customTransparentSort || reversePainterSortStable );\n\t\tif ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable );\n\n\t}\n\n\tfunction finish() {\n\n\t\t// Clear references from inactive renderItems in the list\n\n\t\tfor ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) {\n\n\t\t\tconst renderItem = renderItems[ i ];\n\n\t\t\tif ( renderItem.id === null ) break;\n\n\t\t\trenderItem.id = null;\n\t\t\trenderItem.object = null;\n\t\t\trenderItem.geometry = null;\n\t\t\trenderItem.material = null;\n\t\t\trenderItem.group = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\topaque: opaque,\n\t\ttransmissive: transmissive,\n\t\ttransparent: transparent,\n\n\t\tinit: init,\n\t\tpush: push,\n\t\tunshift: unshift,\n\t\tfinish: finish,\n\n\t\tsort: sort\n\t};\n\n}\n\nfunction WebGLRenderLists() {\n\n\tlet lists = new WeakMap();\n\n\tfunction get( scene, renderCallDepth ) {\n\n\t\tconst listArray = lists.get( scene );\n\t\tlet list;\n\n\t\tif ( listArray === undefined ) {\n\n\t\t\tlist = new WebGLRenderList();\n\t\t\tlists.set( scene, [ list ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= listArray.length ) {\n\n\t\t\t\tlist = new WebGLRenderList();\n\t\t\t\tlistArray.push( list );\n\n\t\t\t} else {\n\n\t\t\t\tlist = listArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn list;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tlists = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction UniformsCache() {\n\n\tconst 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\tlet 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\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\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\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};\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\nfunction ShadowUniformsCache() {\n\n\tconst 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\tlet 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\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 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\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 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\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 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\t// TODO (abelnation): set RectAreaLight shadow uniforms\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\n\n\nlet nextVersion = 0;\n\nfunction shadowCastingAndTexturingLightsFirst( lightA, lightB ) {\n\n\treturn ( lightB.castShadow ? 2 : 0 ) - ( lightA.castShadow ? 2 : 0 ) + ( lightB.map ? 1 : 0 ) - ( lightA.map ? 1 : 0 );\n\n}\n\nfunction WebGLLights( extensions, capabilities ) {\n\n\tconst cache = new UniformsCache();\n\n\tconst shadowCache = ShadowUniformsCache();\n\n\tconst state = {\n\n\t\tversion: 0,\n\n\t\thash: {\n\t\t\tdirectionalLength: - 1,\n\t\t\tpointLength: - 1,\n\t\t\tspotLength: - 1,\n\t\t\trectAreaLength: - 1,\n\t\t\themiLength: - 1,\n\n\t\t\tnumDirectionalShadows: - 1,\n\t\t\tnumPointShadows: - 1,\n\t\t\tnumSpotShadows: - 1,\n\t\t\tnumSpotMaps: - 1,\n\n\t\t\tnumLightProbes: - 1\n\t\t},\n\n\t\tambient: [ 0, 0, 0 ],\n\t\tprobe: [],\n\t\tdirectional: [],\n\t\tdirectionalShadow: [],\n\t\tdirectionalShadowMap: [],\n\t\tdirectionalShadowMatrix: [],\n\t\tspot: [],\n\t\tspotLightMap: [],\n\t\tspotShadow: [],\n\t\tspotShadowMap: [],\n\t\tspotLightMatrix: [],\n\t\trectArea: [],\n\t\trectAreaLTC1: null,\n\t\trectAreaLTC2: null,\n\t\tpoint: [],\n\t\tpointShadow: [],\n\t\tpointShadowMap: [],\n\t\tpointShadowMatrix: [],\n\t\themi: [],\n\t\tnumSpotLightShadowsWithMaps: 0,\n\t\tnumLightProbes: 0\n\n\t};\n\n\tfor ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() );\n\n\tconst vector3 = new Vector3();\n\tconst matrix4 = new Matrix4();\n\tconst matrix42 = new Matrix4();\n\n\tfunction setup( lights, useLegacyLights ) {\n\n\t\tlet r = 0, g = 0, b = 0;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 );\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tlet numDirectionalShadows = 0;\n\t\tlet numPointShadows = 0;\n\t\tlet numSpotShadows = 0;\n\t\tlet numSpotMaps = 0;\n\t\tlet numSpotShadowsWithMaps = 0;\n\n\t\tlet numLightProbes = 0;\n\n\t\t// ordering : [shadow casting + map texturing, map texturing, shadow casting, none ]\n\t\tlights.sort( shadowCastingAndTexturingLightsFirst );\n\n\t\t// artist-friendly light intensity scaling factor\n\t\tconst scaleFactor = ( useLegacyLights === true ) ? Math.PI : 1;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tconst color = light.color;\n\t\t\tconst intensity = light.intensity;\n\t\t\tconst distance = light.distance;\n\n\t\t\tconst 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 * scaleFactor;\n\t\t\t\tg += color.g * intensity * scaleFactor;\n\t\t\t\tb += color.b * intensity * scaleFactor;\n\n\t\t\t} else if ( light.isLightProbe ) {\n\n\t\t\t\tfor ( let j = 0; j < 9; j ++ ) {\n\n\t\t\t\t\tstate.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity );\n\n\t\t\t\t}\n\n\t\t\t\tnumLightProbes ++;\n\n\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity * scaleFactor );\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.directionalShadow[ directionalLength ] = shadowUniforms;\n\t\t\t\t\tstate.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\tstate.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumDirectionalShadows ++;\n\n\t\t\t\t}\n\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\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity * scaleFactor );\n\t\t\t\tuniforms.distance = distance;\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.decay;\n\n\t\t\t\tstate.spot[ spotLength ] = uniforms;\n\n\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\tif ( light.map ) {\n\n\t\t\t\t\tstate.spotLightMap[ numSpotMaps ] = light.map;\n\t\t\t\t\tnumSpotMaps ++;\n\n\t\t\t\t\t// make sure the lightMatrix is up to date\n\t\t\t\t\t// TODO : do it if required only\n\t\t\t\t\tshadow.updateMatrices( light );\n\n\t\t\t\t\tif ( light.castShadow ) numSpotShadowsWithMaps ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.spotLightMatrix[ spotLength ] = shadow.matrix;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.spotShadow[ spotLength ] = shadowUniforms;\n\t\t\t\t\tstate.spotShadowMap[ spotLength ] = shadowMap;\n\n\t\t\t\t\tnumSpotShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\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\tstate.rectArea[ rectAreaLength ] = uniforms;\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity * scaleFactor );\n\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\t\t\t\t\tshadowUniforms.shadowCameraNear = shadow.camera.near;\n\t\t\t\t\tshadowUniforms.shadowCameraFar = shadow.camera.far;\n\n\t\t\t\t\tstate.pointShadow[ pointLength ] = shadowUniforms;\n\t\t\t\t\tstate.pointShadowMap[ pointLength ] = shadowMap;\n\t\t\t\t\tstate.pointShadowMatrix[ pointLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumPointShadows ++;\n\n\t\t\t\t}\n\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\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity * scaleFactor );\n\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity * scaleFactor );\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\tif ( rectAreaLength > 0 ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\t// WebGL 2\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t} else {\n\n\t\t\t\t// WebGL 1\n\n\t\t\t\tif ( extensions.has( 'OES_texture_float_linear' ) === true ) {\n\n\t\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t\t} else if ( extensions.has( 'OES_texture_half_float_linear' ) === true ) {\n\n\t\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_HALF_1;\n\t\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_HALF_2;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.' );\n\n\t\t\t\t}\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\tconst hash = state.hash;\n\n\t\tif ( hash.directionalLength !== directionalLength ||\n\t\t\thash.pointLength !== pointLength ||\n\t\t\thash.spotLength !== spotLength ||\n\t\t\thash.rectAreaLength !== rectAreaLength ||\n\t\t\thash.hemiLength !== hemiLength ||\n\t\t\thash.numDirectionalShadows !== numDirectionalShadows ||\n\t\t\thash.numPointShadows !== numPointShadows ||\n\t\t\thash.numSpotShadows !== numSpotShadows ||\n\t\t\thash.numSpotMaps !== numSpotMaps ||\n\t\t\thash.numLightProbes !== numLightProbes ) {\n\n\t\t\tstate.directional.length = directionalLength;\n\t\t\tstate.spot.length = spotLength;\n\t\t\tstate.rectArea.length = rectAreaLength;\n\t\t\tstate.point.length = pointLength;\n\t\t\tstate.hemi.length = hemiLength;\n\n\t\t\tstate.directionalShadow.length = numDirectionalShadows;\n\t\t\tstate.directionalShadowMap.length = numDirectionalShadows;\n\t\t\tstate.pointShadow.length = numPointShadows;\n\t\t\tstate.pointShadowMap.length = numPointShadows;\n\t\t\tstate.spotShadow.length = numSpotShadows;\n\t\t\tstate.spotShadowMap.length = numSpotShadows;\n\t\t\tstate.directionalShadowMatrix.length = numDirectionalShadows;\n\t\t\tstate.pointShadowMatrix.length = numPointShadows;\n\t\t\tstate.spotLightMatrix.length = numSpotShadows + numSpotMaps - numSpotShadowsWithMaps;\n\t\t\tstate.spotLightMap.length = numSpotMaps;\n\t\t\tstate.numSpotLightShadowsWithMaps = numSpotShadowsWithMaps;\n\t\t\tstate.numLightProbes = numLightProbes;\n\n\t\t\thash.directionalLength = directionalLength;\n\t\t\thash.pointLength = pointLength;\n\t\t\thash.spotLength = spotLength;\n\t\t\thash.rectAreaLength = rectAreaLength;\n\t\t\thash.hemiLength = hemiLength;\n\n\t\t\thash.numDirectionalShadows = numDirectionalShadows;\n\t\t\thash.numPointShadows = numPointShadows;\n\t\t\thash.numSpotShadows = numSpotShadows;\n\t\t\thash.numSpotMaps = numSpotMaps;\n\n\t\t\thash.numLightProbes = numLightProbes;\n\n\t\t\tstate.version = nextVersion ++;\n\n\t\t}\n\n\t}\n\n\tfunction setupView( lights, camera ) {\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tconst viewMatrix = camera.matrixWorldInverse;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tif ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = state.directional[ directionalLength ];\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\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = state.spot[ spotLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\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\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = state.rectArea[ rectAreaLength ];\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\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = state.point[ pointLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = state.hemi[ hemiLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tsetup: setup,\n\t\tsetupView: setupView,\n\t\tstate: state\n\t};\n\n}\n\nfunction WebGLRenderState( extensions, capabilities ) {\n\n\tconst lights = new WebGLLights( extensions, capabilities );\n\n\tconst lightsArray = [];\n\tconst shadowsArray = [];\n\n\tfunction init() {\n\n\t\tlightsArray.length = 0;\n\t\tshadowsArray.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 setupLights( useLegacyLights ) {\n\n\t\tlights.setup( lightsArray, useLegacyLights );\n\n\t}\n\n\tfunction setupLightsView( camera ) {\n\n\t\tlights.setupView( lightsArray, camera );\n\n\t}\n\n\tconst state = {\n\t\tlightsArray: lightsArray,\n\t\tshadowsArray: shadowsArray,\n\n\t\tlights: lights\n\t};\n\n\treturn {\n\t\tinit: init,\n\t\tstate: state,\n\t\tsetupLights: setupLights,\n\t\tsetupLightsView: setupLightsView,\n\n\t\tpushLight: pushLight,\n\t\tpushShadow: pushShadow\n\t};\n\n}\n\nfunction WebGLRenderStates( extensions, capabilities ) {\n\n\tlet renderStates = new WeakMap();\n\n\tfunction get( scene, renderCallDepth = 0 ) {\n\n\t\tconst renderStateArray = renderStates.get( scene );\n\t\tlet renderState;\n\n\t\tif ( renderStateArray === undefined ) {\n\n\t\t\trenderState = new WebGLRenderState( extensions, capabilities );\n\t\t\trenderStates.set( scene, [ renderState ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= renderStateArray.length ) {\n\n\t\t\t\trenderState = new WebGLRenderState( extensions, capabilities );\n\t\t\t\trenderStateArray.push( renderState );\n\n\t\t\t} else {\n\n\t\t\t\trenderState = renderStateArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn renderState;\n\n\t}\n\n\tfunction dispose() {\n\n\t\trenderStates = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nclass MeshDepthMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshDepthMaterial = true;\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshDistanceMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshDistanceMaterial = true;\n\n\t\tthis.type = 'MeshDistanceMaterial';\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst vertex = \"void main() {\\n\\tgl_Position = vec4( position, 1.0 );\\n}\";\n\nconst fragment = \"uniform sampler2D shadow_pass;\\nuniform vec2 resolution;\\nuniform float radius;\\n#include <packing>\\nvoid main() {\\n\\tconst float samples = float( VSM_SAMPLES );\\n\\tfloat mean = 0.0;\\n\\tfloat squared_mean = 0.0;\\n\\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\\n\\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\\n\\tfor ( float i = 0.0; i < samples; i ++ ) {\\n\\t\\tfloat uvOffset = uvStart + i * uvStride;\\n\\t\\t#ifdef HORIZONTAL_PASS\\n\\t\\t\\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\\n\\t\\t\\tmean += distribution.x;\\n\\t\\t\\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\\n\\t\\t#else\\n\\t\\t\\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\\n\\t\\t\\tmean += depth;\\n\\t\\t\\tsquared_mean += depth * depth;\\n\\t\\t#endif\\n\\t}\\n\\tmean = mean / samples;\\n\\tsquared_mean = squared_mean / samples;\\n\\tfloat std_dev = sqrt( squared_mean - mean * mean );\\n\\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\\n}\";\n\nfunction WebGLShadowMap( _renderer, _objects, _capabilities ) {\n\n\tlet _frustum = new Frustum();\n\n\tconst _shadowMapSize = new Vector2(),\n\t\t_viewportSize = new Vector2(),\n\n\t\t_viewport = new Vector4(),\n\n\t\t_depthMaterial = new MeshDepthMaterial( { depthPacking: RGBADepthPacking } ),\n\t\t_distanceMaterial = new MeshDistanceMaterial(),\n\n\t\t_materialCache = {},\n\n\t\t_maxTextureSize = _capabilities.maxTextureSize;\n\n\tconst shadowSide = { [ FrontSide ]: BackSide, [ BackSide ]: FrontSide, [ DoubleSide ]: DoubleSide };\n\n\tconst shadowMaterialVertical = new ShaderMaterial( {\n\t\tdefines: {\n\t\t\tVSM_SAMPLES: 8\n\t\t},\n\t\tuniforms: {\n\t\t\tshadow_pass: { value: null },\n\t\t\tresolution: { value: new Vector2() },\n\t\t\tradius: { value: 4.0 }\n\t\t},\n\n\t\tvertexShader: vertex,\n\t\tfragmentShader: fragment\n\n\t} );\n\n\tconst shadowMaterialHorizontal = shadowMaterialVertical.clone();\n\tshadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1;\n\n\tconst fullScreenTri = new BufferGeometry();\n\tfullScreenTri.setAttribute(\n\t\t'position',\n\t\tnew BufferAttribute(\n\t\t\tnew Float32Array( [ - 1, - 1, 0.5, 3, - 1, 0.5, - 1, 3, 0.5 ] ),\n\t\t\t3\n\t\t)\n\t);\n\n\tconst fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical );\n\n\tconst scope = this;\n\n\tthis.enabled = false;\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis.type = PCFShadowMap;\n\tlet _previousType = this.type;\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\tconst currentRenderTarget = _renderer.getRenderTarget();\n\t\tconst activeCubeFace = _renderer.getActiveCubeFace();\n\t\tconst activeMipmapLevel = _renderer.getActiveMipmapLevel();\n\n\t\tconst _state = _renderer.state;\n\n\t\t// Set GL state for depth map.\n\t\t_state.setBlending( NoBlending );\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// check for shadow map type changes\n\n\t\tconst toVSM = ( _previousType !== VSMShadowMap && this.type === VSMShadowMap );\n\t\tconst fromVSM = ( _previousType === VSMShadowMap && this.type !== VSMShadowMap );\n\n\t\t// render depth map\n\n\t\tfor ( let i = 0, il = lights.length; i < il; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\t\t\tconst shadow = light.shadow;\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\tif ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue;\n\n\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\n\t\t\tconst shadowFrameExtents = shadow.getFrameExtents();\n\n\t\t\t_shadowMapSize.multiply( shadowFrameExtents );\n\n\t\t\t_viewportSize.copy( shadow.mapSize );\n\n\t\t\tif ( _shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\tif ( _shadowMapSize.x > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.x = Math.floor( _maxTextureSize / shadowFrameExtents.x );\n\t\t\t\t\t_shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x;\n\t\t\t\t\tshadow.mapSize.x = _viewportSize.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.y = Math.floor( _maxTextureSize / shadowFrameExtents.y );\n\t\t\t\t\t_shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y;\n\t\t\t\t\tshadow.mapSize.y = _viewportSize.y;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null || toVSM === true || fromVSM === true ) {\n\n\t\t\t\tconst pars = ( this.type !== VSMShadowMap ) ? { minFilter: NearestFilter, magFilter: NearestFilter } : {};\n\n\t\t\t\tif ( shadow.map !== null ) {\n\n\t\t\t\t\tshadow.map.dispose();\n\n\t\t\t\t}\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\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\t_renderer.setRenderTarget( shadow.map );\n\t\t\t_renderer.clear();\n\n\t\t\tconst viewportCount = shadow.getViewportCount();\n\n\t\t\tfor ( let vp = 0; vp < viewportCount; vp ++ ) {\n\n\t\t\t\tconst viewport = shadow.getViewport( vp );\n\n\t\t\t\t_viewport.set(\n\t\t\t\t\t_viewportSize.x * viewport.x,\n\t\t\t\t\t_viewportSize.y * viewport.y,\n\t\t\t\t\t_viewportSize.x * viewport.z,\n\t\t\t\t\t_viewportSize.y * viewport.w\n\t\t\t\t);\n\n\t\t\t\t_state.viewport( _viewport );\n\n\t\t\t\tshadow.updateMatrices( light, vp );\n\n\t\t\t\t_frustum = shadow.getFrustum();\n\n\t\t\t\trenderObject( scene, camera, shadow.camera, light, this.type );\n\n\t\t\t}\n\n\t\t\t// do blur pass for VSM\n\n\t\t\tif ( shadow.isPointLightShadow !== true && this.type === VSMShadowMap ) {\n\n\t\t\t\tVSMPass( shadow, camera );\n\n\t\t\t}\n\n\t\t\tshadow.needsUpdate = false;\n\n\t\t}\n\n\t\t_previousType = this.type;\n\n\t\tscope.needsUpdate = false;\n\n\t\t_renderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel );\n\n\t};\n\n\tfunction VSMPass( shadow, camera ) {\n\n\t\tconst geometry = _objects.update( fullScreenMesh );\n\n\t\tif ( shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples ) {\n\n\t\t\tshadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples;\n\t\t\tshadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples;\n\n\t\t\tshadowMaterialVertical.needsUpdate = true;\n\t\t\tshadowMaterialHorizontal.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( shadow.mapPass === null ) {\n\n\t\t\tshadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y );\n\n\t\t}\n\n\t\t// vertical pass\n\n\t\tshadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture;\n\t\tshadowMaterialVertical.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialVertical.uniforms.radius.value = shadow.radius;\n\t\t_renderer.setRenderTarget( shadow.mapPass );\n\t\t_renderer.clear();\n\t\t_renderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null );\n\n\t\t// horizontal pass\n\n\t\tshadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture;\n\t\tshadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialHorizontal.uniforms.radius.value = shadow.radius;\n\t\t_renderer.setRenderTarget( shadow.map );\n\t\t_renderer.clear();\n\t\t_renderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null );\n\n\t}\n\n\tfunction getDepthMaterial( object, material, light, type ) {\n\n\t\tlet result = null;\n\n\t\tconst customMaterial = ( light.isPointLight === true ) ? object.customDistanceMaterial : object.customDepthMaterial;\n\n\t\tif ( customMaterial !== undefined ) {\n\n\t\t\tresult = customMaterial;\n\n\t\t} else {\n\n\t\t\tresult = ( light.isPointLight === true ) ? _distanceMaterial : _depthMaterial;\n\n\t\t\tif ( ( _renderer.localClippingEnabled && material.clipShadows === true && Array.isArray( material.clippingPlanes ) && material.clippingPlanes.length !== 0 ) ||\n\t\t\t\t( material.displacementMap && material.displacementScale !== 0 ) ||\n\t\t\t\t( material.alphaMap && material.alphaTest > 0 ) ||\n\t\t\t\t( material.map && material.alphaTest > 0 ) ) {\n\n\t\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t\t// appropriate state\n\n\t\t\t\tconst keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tlet materialsForVariant = _materialCache[ keyA ];\n\n\t\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t\t}\n\n\t\t\t\tlet cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\n\t\t\t\t}\n\n\t\t\t\tresult = cachedMaterial;\n\n\t\t\t}\n\n\t\t}\n\n\t\tresult.visible = material.visible;\n\t\tresult.wireframe = material.wireframe;\n\n\t\tif ( type === VSMShadowMap ) {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;\n\n\t\t} else {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ];\n\n\t\t}\n\n\t\tresult.alphaMap = material.alphaMap;\n\t\tresult.alphaTest = material.alphaTest;\n\t\tresult.map = material.map;\n\n\t\tresult.clipShadows = material.clipShadows;\n\t\tresult.clippingPlanes = material.clippingPlanes;\n\t\tresult.clipIntersection = material.clipIntersection;\n\n\t\tresult.displacementMap = material.displacementMap;\n\t\tresult.displacementScale = material.displacementScale;\n\t\tresult.displacementBias = material.displacementBias;\n\n\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\tresult.linewidth = material.linewidth;\n\n\t\tif ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) {\n\n\t\t\tconst materialProperties = _renderer.properties.get( result );\n\t\t\tmaterialProperties.light = light;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction renderObject( object, camera, shadowCamera, light, type ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst 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.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\n\t\t\t\tconst geometry = _objects.update( object );\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\tfor ( let k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ k ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, groupMaterial, light, type );\n\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\tconst depthMaterial = getDepthMaterial( object, material, light, type );\n\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\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( children[ i ], camera, shadowCamera, light, type );\n\n\t\t}\n\n\t}\n\n}\n\nfunction WebGLState( gl, extensions, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tfunction ColorBuffer() {\n\n\t\tlet locked = false;\n\n\t\tconst color = new Vector4();\n\t\tlet currentColorMask = null;\n\t\tconst 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\tlet locked = false;\n\n\t\tlet currentDepthMask = null;\n\t\tlet currentDepthFunc = null;\n\t\tlet 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\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\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\tlet locked = false;\n\n\t\tlet currentStencilMask = null;\n\t\tlet currentStencilFunc = null;\n\t\tlet currentStencilRef = null;\n\t\tlet currentStencilFuncMask = null;\n\t\tlet currentStencilFail = null;\n\t\tlet currentStencilZFail = null;\n\t\tlet currentStencilZPass = null;\n\t\tlet currentStencilClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\tif ( ! locked ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t\t}\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 !== stencilRef ||\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 !== stencilFail ||\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\tconst colorBuffer = new ColorBuffer();\n\tconst depthBuffer = new DepthBuffer();\n\tconst stencilBuffer = new StencilBuffer();\n\n\tconst uboBindings = new WeakMap();\n\tconst uboProgramMap = new WeakMap();\n\n\tlet enabledCapabilities = {};\n\n\tlet currentBoundFramebuffers = {};\n\tlet currentDrawbuffers = new WeakMap();\n\tlet defaultDrawbuffers = [];\n\n\tlet currentProgram = null;\n\n\tlet currentBlendingEnabled = false;\n\tlet currentBlending = null;\n\tlet currentBlendEquation = null;\n\tlet currentBlendSrc = null;\n\tlet currentBlendDst = null;\n\tlet currentBlendEquationAlpha = null;\n\tlet currentBlendSrcAlpha = null;\n\tlet currentBlendDstAlpha = null;\n\tlet currentBlendColor = new Color( 0, 0, 0 );\n\tlet currentBlendAlpha = 0;\n\tlet currentPremultipledAlpha = false;\n\n\tlet currentFlipSided = null;\n\tlet currentCullFace = null;\n\n\tlet currentLineWidth = null;\n\n\tlet currentPolygonOffsetFactor = null;\n\tlet currentPolygonOffsetUnits = null;\n\n\tconst maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS );\n\n\tlet lineWidthAvailable = false;\n\tlet version = 0;\n\tconst glVersion = gl.getParameter( gl.VERSION );\n\n\tif ( glVersion.indexOf( 'WebGL' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^WebGL (\\d)/.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 (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 2.0 );\n\n\t}\n\n\tlet currentTextureSlot = null;\n\tlet currentBoundTextures = {};\n\n\tconst scissorParam = gl.getParameter( gl.SCISSOR_BOX );\n\tconst viewportParam = gl.getParameter( gl.VIEWPORT );\n\n\tconst currentScissor = new Vector4().fromArray( scissorParam );\n\tconst currentViewport = new Vector4().fromArray( viewportParam );\n\n\tfunction createTexture( type, target, count, dimensions ) {\n\n\t\tconst data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\tconst 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 ( let i = 0; i < count; i ++ ) {\n\n\t\t\tif ( isWebGL2 && ( type === gl.TEXTURE_3D || type === gl.TEXTURE_2D_ARRAY ) ) {\n\n\t\t\t\tgl.texImage3D( target, 0, gl.RGBA, 1, 1, dimensions, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t} else {\n\n\t\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tconst 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\tif ( isWebGL2 ) {\n\n\t\temptyTextures[ gl.TEXTURE_2D_ARRAY ] = createTexture( gl.TEXTURE_2D_ARRAY, gl.TEXTURE_2D_ARRAY, 1, 1 );\n\t\temptyTextures[ gl.TEXTURE_3D ] = createTexture( gl.TEXTURE_3D, gl.TEXTURE_3D, 1, 1 );\n\n\t}\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\tsetBlending( NoBlending );\n\n\t//\n\n\tfunction enable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== true ) {\n\n\t\t\tgl.enable( id );\n\t\t\tenabledCapabilities[ id ] = true;\n\n\t\t}\n\n\t}\n\n\tfunction disable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== false ) {\n\n\t\t\tgl.disable( id );\n\t\t\tenabledCapabilities[ id ] = false;\n\n\t\t}\n\n\t}\n\n\tfunction bindFramebuffer( target, framebuffer ) {\n\n\t\tif ( currentBoundFramebuffers[ target ] !== framebuffer ) {\n\n\t\t\tgl.bindFramebuffer( target, framebuffer );\n\n\t\t\tcurrentBoundFramebuffers[ target ] = framebuffer;\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t// gl.DRAW_FRAMEBUFFER is equivalent to gl.FRAMEBUFFER\n\n\t\t\t\tif ( target === gl.DRAW_FRAMEBUFFER ) {\n\n\t\t\t\t\tcurrentBoundFramebuffers[ gl.FRAMEBUFFER ] = framebuffer;\n\n\t\t\t\t}\n\n\t\t\t\tif ( target === gl.FRAMEBUFFER ) {\n\n\t\t\t\t\tcurrentBoundFramebuffers[ gl.DRAW_FRAMEBUFFER ] = framebuffer;\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 false;\n\n\t}\n\n\tfunction drawBuffers( renderTarget, framebuffer ) {\n\n\t\tlet drawBuffers = defaultDrawbuffers;\n\n\t\tlet needsUpdate = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tdrawBuffers = currentDrawbuffers.get( framebuffer );\n\n\t\t\tif ( drawBuffers === undefined ) {\n\n\t\t\t\tdrawBuffers = [];\n\t\t\t\tcurrentDrawbuffers.set( framebuffer, drawBuffers );\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.isWebGLMultipleRenderTargets ) {\n\n\t\t\t\tconst textures = renderTarget.texture;\n\n\t\t\t\tif ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {\n\n\t\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tdrawBuffers[ i ] = gl.COLOR_ATTACHMENT0 + i;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tdrawBuffers.length = textures.length;\n\n\t\t\t\t\tneedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {\n\n\t\t\t\t\tdrawBuffers[ 0 ] = gl.COLOR_ATTACHMENT0;\n\n\t\t\t\t\tneedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( drawBuffers[ 0 ] !== gl.BACK ) {\n\n\t\t\t\tdrawBuffers[ 0 ] = gl.BACK;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\tgl.drawBuffers( drawBuffers );\n\n\t\t\t} else {\n\n\t\t\t\textensions.get( 'WEBGL_draw_buffers' ).drawBuffersWEBGL( drawBuffers );\n\n\t\t\t}\n\n\t\t}\n\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\tconst equationToGL = {\n\t\t[ AddEquation ]: gl.FUNC_ADD,\n\t\t[ SubtractEquation ]: gl.FUNC_SUBTRACT,\n\t\t[ ReverseSubtractEquation ]: gl.FUNC_REVERSE_SUBTRACT\n\t};\n\n\tif ( isWebGL2 ) {\n\n\t\tequationToGL[ MinEquation ] = gl.MIN;\n\t\tequationToGL[ MaxEquation ] = gl.MAX;\n\n\t} else {\n\n\t\tconst extension = extensions.get( 'EXT_blend_minmax' );\n\n\t\tif ( extension !== null ) {\n\n\t\t\tequationToGL[ MinEquation ] = extension.MIN_EXT;\n\t\t\tequationToGL[ MaxEquation ] = extension.MAX_EXT;\n\n\t\t}\n\n\t}\n\n\tconst factorToGL = {\n\t\t[ ZeroFactor ]: gl.ZERO,\n\t\t[ OneFactor ]: gl.ONE,\n\t\t[ SrcColorFactor ]: gl.SRC_COLOR,\n\t\t[ SrcAlphaFactor ]: gl.SRC_ALPHA,\n\t\t[ SrcAlphaSaturateFactor ]: gl.SRC_ALPHA_SATURATE,\n\t\t[ DstColorFactor ]: gl.DST_COLOR,\n\t\t[ DstAlphaFactor ]: gl.DST_ALPHA,\n\t\t[ OneMinusSrcColorFactor ]: gl.ONE_MINUS_SRC_COLOR,\n\t\t[ OneMinusSrcAlphaFactor ]: gl.ONE_MINUS_SRC_ALPHA,\n\t\t[ OneMinusDstColorFactor ]: gl.ONE_MINUS_DST_COLOR,\n\t\t[ OneMinusDstAlphaFactor ]: gl.ONE_MINUS_DST_ALPHA,\n\t\t[ ConstantColorFactor ]: gl.CONSTANT_COLOR,\n\t\t[ OneMinusConstantColorFactor ]: gl.ONE_MINUS_CONSTANT_COLOR,\n\t\t[ ConstantAlphaFactor ]: gl.CONSTANT_ALPHA,\n\t\t[ OneMinusConstantAlphaFactor ]: gl.ONE_MINUS_CONSTANT_ALPHA\n\t};\n\n\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, blendColor, blendAlpha, premultipliedAlpha ) {\n\n\t\tif ( blending === NoBlending ) {\n\n\t\t\tif ( currentBlendingEnabled === true ) {\n\n\t\t\t\tdisable( gl.BLEND );\n\t\t\t\tcurrentBlendingEnabled = false;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( currentBlendingEnabled === false ) {\n\n\t\t\tenable( gl.BLEND );\n\t\t\tcurrentBlendingEnabled = true;\n\n\t\t}\n\n\t\tif ( blending !== CustomBlending ) {\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) {\n\n\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\n\t\t\t\t\tcurrentBlendEquation = AddEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = AddEquation;\n\n\t\t\t\t}\n\n\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.ONE, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\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\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.SRC_COLOR );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\t\t\t\tcurrentBlendColor.set( 0, 0, 0 );\n\t\t\t\tcurrentBlendAlpha = 0;\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// custom blending\n\n\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\tgl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] );\n\n\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t}\n\n\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\tgl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] );\n\n\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\tcurrentBlendDst = blendDst;\n\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t}\n\n\t\tif ( blendColor.equals( currentBlendColor ) === false || blendAlpha !== currentBlendAlpha ) {\n\n\t\t\tgl.blendColor( blendColor.r, blendColor.g, blendColor.b, blendAlpha );\n\n\t\t\tcurrentBlendColor.copy( blendColor );\n\t\t\tcurrentBlendAlpha = blendAlpha;\n\n\t\t}\n\n\t\tcurrentBlending = blending;\n\t\tcurrentPremultipledAlpha = false;\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\tlet flipSided = ( material.side === BackSide );\n\t\tif ( frontFaceCW ) flipSided = ! flipSided;\n\n\t\tsetFlipSided( flipSided );\n\n\t\t( material.blending === NormalBlending && material.transparent === false )\n\t\t\t? setBlending( NoBlending )\n\t\t\t: setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.blendColor, material.blendAlpha, material.premultipliedAlpha );\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\tconst stencilWrite = material.stencilWrite;\n\t\tstencilBuffer.setTest( stencilWrite );\n\t\tif ( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( material.stencilWriteMask );\n\t\t\tstencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask );\n\t\t\tstencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass );\n\n\t\t}\n\n\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\tmaterial.alphaToCoverage === true\n\t\t\t? enable( gl.SAMPLE_ALPHA_TO_COVERAGE )\n\t\t\t: disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\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, webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\twebglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\t\t} else {\n\n\t\t\t\twebglSlot = currentTextureSlot;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet boundTexture = currentBoundTextures[ webglSlot ];\n\n\t\tif ( boundTexture === undefined ) {\n\n\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\tcurrentBoundTextures[ webglSlot ] = boundTexture;\n\n\t\t}\n\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\t\tgl.activeTexture( webglSlot );\n\t\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t\t}\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 unbindTexture() {\n\n\t\tconst boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture !== undefined && boundTexture.type !== undefined ) {\n\n\t\t\tgl.bindTexture( boundTexture.type, null );\n\n\t\t\tboundTexture.type = undefined;\n\t\t\tboundTexture.texture = undefined;\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 compressedTexImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage3D.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 texSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage2D.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 texSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage3D.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 compressedTexSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage2D.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 compressedTexSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage3D.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 texStorage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage2D.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 texStorage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage3D.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\tfunction texImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage3D.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\tfunction updateUBOMapping( uniformsGroup, program ) {\n\n\t\tlet mapping = uboProgramMap.get( program );\n\n\t\tif ( mapping === undefined ) {\n\n\t\t\tmapping = new WeakMap();\n\n\t\t\tuboProgramMap.set( program, mapping );\n\n\t\t}\n\n\t\tlet blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( blockIndex === undefined ) {\n\n\t\t\tblockIndex = gl.getUniformBlockIndex( program, uniformsGroup.name );\n\n\t\t\tmapping.set( uniformsGroup, blockIndex );\n\n\t\t}\n\n\t}\n\n\tfunction uniformBlockBinding( uniformsGroup, program ) {\n\n\t\tconst mapping = uboProgramMap.get( program );\n\t\tconst blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( uboBindings.get( program ) !== blockIndex ) {\n\n\t\t\t// bind shader specific block index to global block point\n\t\t\tgl.uniformBlockBinding( program, blockIndex, uniformsGroup.__bindingPointIndex );\n\n\t\t\tuboBindings.set( program, blockIndex );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction reset() {\n\n\t\t// reset state\n\n\t\tgl.disable( gl.BLEND );\n\t\tgl.disable( gl.CULL_FACE );\n\t\tgl.disable( gl.DEPTH_TEST );\n\t\tgl.disable( gl.POLYGON_OFFSET_FILL );\n\t\tgl.disable( gl.SCISSOR_TEST );\n\t\tgl.disable( gl.STENCIL_TEST );\n\t\tgl.disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\tgl.blendFunc( gl.ONE, gl.ZERO );\n\t\tgl.blendFuncSeparate( gl.ONE, gl.ZERO, gl.ONE, gl.ZERO );\n\t\tgl.blendColor( 0, 0, 0, 0 );\n\n\t\tgl.colorMask( true, true, true, true );\n\t\tgl.clearColor( 0, 0, 0, 0 );\n\n\t\tgl.depthMask( true );\n\t\tgl.depthFunc( gl.LESS );\n\t\tgl.clearDepth( 1 );\n\n\t\tgl.stencilMask( 0xffffffff );\n\t\tgl.stencilFunc( gl.ALWAYS, 0, 0xffffffff );\n\t\tgl.stencilOp( gl.KEEP, gl.KEEP, gl.KEEP );\n\t\tgl.clearStencil( 0 );\n\n\t\tgl.cullFace( gl.BACK );\n\t\tgl.frontFace( gl.CCW );\n\n\t\tgl.polygonOffset( 0, 0 );\n\n\t\tgl.activeTexture( gl.TEXTURE0 );\n\n\t\tgl.bindFramebuffer( gl.FRAMEBUFFER, null );\n\n\t\tif ( isWebGL2 === true ) {\n\n\t\t\tgl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, null );\n\t\t\tgl.bindFramebuffer( gl.READ_FRAMEBUFFER, null );\n\n\t\t}\n\n\t\tgl.useProgram( null );\n\n\t\tgl.lineWidth( 1 );\n\n\t\tgl.scissor( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tgl.viewport( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\t// reset internals\n\n\t\tenabledCapabilities = {};\n\n\t\tcurrentTextureSlot = null;\n\t\tcurrentBoundTextures = {};\n\n\t\tcurrentBoundFramebuffers = {};\n\t\tcurrentDrawbuffers = new WeakMap();\n\t\tdefaultDrawbuffers = [];\n\n\t\tcurrentProgram = null;\n\n\t\tcurrentBlendingEnabled = false;\n\t\tcurrentBlending = null;\n\t\tcurrentBlendEquation = null;\n\t\tcurrentBlendSrc = null;\n\t\tcurrentBlendDst = null;\n\t\tcurrentBlendEquationAlpha = null;\n\t\tcurrentBlendSrcAlpha = null;\n\t\tcurrentBlendDstAlpha = null;\n\t\tcurrentBlendColor = new Color( 0, 0, 0 );\n\t\tcurrentBlendAlpha = 0;\n\t\tcurrentPremultipledAlpha = false;\n\n\t\tcurrentFlipSided = null;\n\t\tcurrentCullFace = null;\n\n\t\tcurrentLineWidth = null;\n\n\t\tcurrentPolygonOffsetFactor = null;\n\t\tcurrentPolygonOffsetUnits = null;\n\n\t\tcurrentScissor.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tcurrentViewport.set( 0, 0, gl.canvas.width, gl.canvas.height );\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\tenable: enable,\n\t\tdisable: disable,\n\n\t\tbindFramebuffer: bindFramebuffer,\n\t\tdrawBuffers: drawBuffers,\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\tunbindTexture: unbindTexture,\n\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\tcompressedTexImage3D: compressedTexImage3D,\n\t\ttexImage2D: texImage2D,\n\t\ttexImage3D: texImage3D,\n\n\t\tupdateUBOMapping: updateUBOMapping,\n\t\tuniformBlockBinding: uniformBlockBinding,\n\n\t\ttexStorage2D: texStorage2D,\n\t\ttexStorage3D: texStorage3D,\n\t\ttexSubImage2D: texSubImage2D,\n\t\ttexSubImage3D: texSubImage3D,\n\t\tcompressedTexSubImage2D: compressedTexSubImage2D,\n\t\tcompressedTexSubImage3D: compressedTexSubImage3D,\n\n\t\tscissor: scissor,\n\t\tviewport: viewport,\n\n\t\treset: reset\n\n\t};\n\n}\n\nfunction WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\tconst maxTextures = capabilities.maxTextures;\n\tconst maxCubemapSize = capabilities.maxCubemapSize;\n\tconst maxTextureSize = capabilities.maxTextureSize;\n\tconst maxSamples = capabilities.maxSamples;\n\tconst multisampledRTTExt = extensions.has( 'WEBGL_multisampled_render_to_texture' ) ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : null;\n\tconst supportsInvalidateFramebuffer = typeof navigator === 'undefined' ? false : /OculusBrowser/g.test( navigator.userAgent );\n\n\tconst _videoTextures = new WeakMap();\n\tlet _canvas;\n\n\tconst _sources = new WeakMap(); // maps WebglTexture objects to instances of Source\n\n\t// cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas,\n\t// also OffscreenCanvas.getContext(\"webgl\"), but not OffscreenCanvas.getContext(\"2d\")!\n\t// Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d).\n\n\tlet useOffscreenCanvas = false;\n\n\ttry {\n\n\t\tuseOffscreenCanvas = typeof OffscreenCanvas !== 'undefined'\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\t&& ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null;\n\n\t} catch ( err ) {\n\n\t\t// Ignore any errors\n\n\t}\n\n\tfunction createCanvas( width, height ) {\n\n\t\t// Use OffscreenCanvas when available. Specially needed in web workers\n\n\t\treturn useOffscreenCanvas ?\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\tnew OffscreenCanvas( width, height ) : createElementNS( 'canvas' );\n\n\t}\n\n\tfunction resizeImage( image, needsPowerOfTwo, needsNewCanvas, maxSize ) {\n\n\t\tlet scale = 1;\n\n\t\t// handle case if texture exceeds max size\n\n\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\tscale = maxSize / Math.max( image.width, image.height );\n\n\t\t}\n\n\t\t// only perform resize if necessary\n\n\t\tif ( scale < 1 || needsPowerOfTwo === true ) {\n\n\t\t\t// only perform resize for certain image types\n\n\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\t\tconst floor = needsPowerOfTwo ? floorPowerOfTwo : Math.floor;\n\n\t\t\t\tconst width = floor( scale * image.width );\n\t\t\t\tconst height = floor( scale * image.height );\n\n\t\t\t\tif ( _canvas === undefined ) _canvas = createCanvas( width, height );\n\n\t\t\t\t// cube textures can't reuse the same canvas\n\n\t\t\t\tconst canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas;\n\n\t\t\t\tcanvas.width = width;\n\t\t\t\tcanvas.height = height;\n\n\t\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, width, height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture has been resized from (' + image.width + 'x' + image.height + ') to (' + width + 'x' + height + ').' );\n\n\t\t\t\treturn canvas;\n\n\t\t\t} else {\n\n\t\t\t\tif ( 'data' in image ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Image in DataTexture is too big (' + image.width + 'x' + image.height + ').' );\n\n\t\t\t\t}\n\n\t\t\t\treturn image;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction isPowerOfTwo$1( image ) {\n\n\t\treturn isPowerOfTwo( image.width ) && isPowerOfTwo( image.height );\n\n\t}\n\n\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\tif ( isWebGL2 ) return false;\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, supportsMips ) {\n\n\t\treturn texture.generateMipmaps && supportsMips &&\n\t\t\ttexture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;\n\n\t}\n\n\tfunction generateMipmap( target ) {\n\n\t\t_gl.generateMipmap( target );\n\n\t}\n\n\tfunction getInternalFormat( internalFormatName, glFormat, glType, colorSpace, forceLinearTransfer = false ) {\n\n\t\tif ( isWebGL2 === false ) return glFormat;\n\n\t\tif ( internalFormatName !== null ) {\n\n\t\t\tif ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ];\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format \\'' + internalFormatName + '\\'' );\n\n\t\t}\n\n\t\tlet internalFormat = glFormat;\n\n\t\tif ( glFormat === _gl.RED ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.R32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.R16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RED_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.R16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.R32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.R8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.R16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.R32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RG32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RG16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGBA ) {\n\n\t\t\tconst transfer = forceLinearTransfer ? LinearTransfer : ColorManagement.getTransfer( colorSpace );\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RGBA32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RGBA16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = ( transfer === SRGBTransfer ) ? _gl.SRGB8_ALPHA8 : _gl.RGBA8;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_4_4_4_4 ) internalFormat = _gl.RGBA4;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_5_5_5_1 ) internalFormat = _gl.RGB5_A1;\n\n\t\t}\n\n\t\tif ( internalFormat === _gl.R16F || internalFormat === _gl.R32F ||\n\t\t\tinternalFormat === _gl.RG16F || internalFormat === _gl.RG32F ||\n\t\t\tinternalFormat === _gl.RGBA16F || internalFormat === _gl.RGBA32F ) {\n\n\t\t\textensions.get( 'EXT_color_buffer_float' );\n\n\t\t}\n\n\t\treturn internalFormat;\n\n\t}\n\n\tfunction getMipLevels( texture, image, supportsMips ) {\n\n\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) {\n\n\t\t\treturn Math.log2( Math.max( image.width, image.height ) ) + 1;\n\n\t\t} else if ( texture.mipmaps !== undefined && texture.mipmaps.length > 0 ) {\n\n\t\t\t// user-defined mipmaps\n\n\t\t\treturn texture.mipmaps.length;\n\n\t\t} else if ( texture.isCompressedTexture && Array.isArray( texture.image ) ) {\n\n\t\t\treturn image.mipmaps.length;\n\n\t\t} else {\n\n\t\t\t// texture without mipmaps (only base level)\n\n\t\t\treturn 1;\n\n\t\t}\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\tconst 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\t_videoTextures.delete( texture );\n\n\t\t}\n\n\t}\n\n\tfunction onRenderTargetDispose( event ) {\n\n\t\tconst renderTarget = event.target;\n\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tdeallocateRenderTarget( renderTarget );\n\n\t}\n\n\t//\n\n\tfunction deallocateTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t// check if it's necessary to remove the WebGLTexture object\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures ) {\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\t\t\twebglTexture.usedTimes --;\n\n\t\t\t// the WebGLTexture object is not used anymore, remove it\n\n\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\tdeleteTexture( texture );\n\n\t\t\t}\n\n\t\t\t// remove the weak map entry if no WebGLTexture uses the source anymore\n\n\t\t\tif ( Object.keys( webglTextures ).length === 0 ) {\n\n\t\t\t\t_sources.delete( source );\n\n\t\t\t}\n\n\t\t}\n\n\t\tproperties.remove( texture );\n\n\t}\n\n\tfunction deleteTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\t\tdelete webglTextures[ textureProperties.__cacheKey ];\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\tinfo.memory.textures --;\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.isWebGLCubeRenderTarget ) {\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( Array.isArray( renderTargetProperties.__webglFramebuffer[ i ] ) ) {\n\n\t\t\t\t\tfor ( let level = 0; level < renderTargetProperties.__webglFramebuffer[ i ].length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ][ level ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\n\t\t\t\t}\n\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\tif ( Array.isArray( renderTargetProperties.__webglFramebuffer ) ) {\n\n\t\t\t\tfor ( let level = 0; level < renderTargetProperties.__webglFramebuffer.length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ level ] );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\t\t\tif ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer ) {\n\n\t\t\t\tfor ( let i = 0; i < renderTargetProperties.__webglColorRenderbuffer.length; i ++ ) {\n\n\t\t\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer[ i ] ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer );\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLMultipleRenderTargets ) {\n\n\t\t\tfor ( let i = 0, il = texture.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachmentProperties = properties.get( texture[ i ] );\n\n\t\t\t\tif ( attachmentProperties.__webglTexture ) {\n\n\t\t\t\t\t_gl.deleteTexture( attachmentProperties.__webglTexture );\n\n\t\t\t\t\tinfo.memory.textures --;\n\n\t\t\t\t}\n\n\t\t\t\tproperties.remove( texture[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tproperties.remove( texture );\n\t\tproperties.remove( renderTarget );\n\n\t}\n\n\t//\n\n\tlet textureUnits = 0;\n\n\tfunction resetTextureUnits() {\n\n\t\ttextureUnits = 0;\n\n\t}\n\n\tfunction allocateTextureUnit() {\n\n\t\tconst textureUnit = textureUnits;\n\n\t\tif ( textureUnit >= maxTextures ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + maxTextures );\n\n\t\t}\n\n\t\ttextureUnits += 1;\n\n\t\treturn textureUnit;\n\n\t}\n\n\tfunction getTextureCacheKey( texture ) {\n\n\t\tconst array = [];\n\n\t\tarray.push( texture.wrapS );\n\t\tarray.push( texture.wrapT );\n\t\tarray.push( texture.wrapR || 0 );\n\t\tarray.push( texture.magFilter );\n\t\tarray.push( texture.minFilter );\n\t\tarray.push( texture.anisotropy );\n\t\tarray.push( texture.internalFormat );\n\t\tarray.push( texture.format );\n\t\tarray.push( texture.type );\n\t\tarray.push( texture.generateMipmaps );\n\t\tarray.push( texture.premultiplyAlpha );\n\t\tarray.push( texture.flipY );\n\t\tarray.push( texture.unpackAlignment );\n\t\tarray.push( texture.colorSpace );\n\n\t\treturn array.join();\n\n\t}\n\n\t//\n\n\tfunction setTexture2D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isVideoTexture ) updateVideoTexture( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tconst image = texture.image;\n\n\t\t\tif ( image === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but no image data found.' );\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' );\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.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTexture2DArray( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_2D_ARRAY, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTexture3D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_3D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTextureCube( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadCubeTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tconst wrappingToGL = {\n\t\t[ RepeatWrapping ]: _gl.REPEAT,\n\t\t[ ClampToEdgeWrapping ]: _gl.CLAMP_TO_EDGE,\n\t\t[ MirroredRepeatWrapping ]: _gl.MIRRORED_REPEAT\n\t};\n\n\tconst filterToGL = {\n\t\t[ NearestFilter ]: _gl.NEAREST,\n\t\t[ NearestMipmapNearestFilter ]: _gl.NEAREST_MIPMAP_NEAREST,\n\t\t[ NearestMipmapLinearFilter ]: _gl.NEAREST_MIPMAP_LINEAR,\n\n\t\t[ LinearFilter ]: _gl.LINEAR,\n\t\t[ LinearMipmapNearestFilter ]: _gl.LINEAR_MIPMAP_NEAREST,\n\t\t[ LinearMipmapLinearFilter ]: _gl.LINEAR_MIPMAP_LINEAR\n\t};\n\n\tconst compareToGL = {\n\t\t[ NeverCompare ]: _gl.NEVER,\n\t\t[ AlwaysCompare ]: _gl.ALWAYS,\n\t\t[ LessCompare ]: _gl.LESS,\n\t\t[ LessEqualCompare ]: _gl.LEQUAL,\n\t\t[ EqualCompare ]: _gl.EQUAL,\n\t\t[ GreaterEqualCompare ]: _gl.GEQUAL,\n\t\t[ GreaterCompare ]: _gl.GREATER,\n\t\t[ NotEqualCompare ]: _gl.NOTEQUAL\n\t};\n\n\tfunction setTextureParameters( textureType, texture, supportsMips ) {\n\n\t\tif ( supportsMips ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, wrappingToGL[ texture.wrapS ] );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, wrappingToGL[ texture.wrapT ] );\n\n\t\t\tif ( textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_R, wrappingToGL[ texture.wrapR ] );\n\n\t\t\t}\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterToGL[ texture.magFilter ] );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterToGL[ 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 ( textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_R, _gl.CLAMP_TO_EDGE );\n\n\t\t\t}\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.' );\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.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( texture.compareFunction ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_MODE, _gl.COMPARE_REF_TO_TEXTURE );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_FUNC, compareToGL[ texture.compareFunction ] );\n\n\t\t}\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( texture.magFilter === NearestFilter ) return;\n\t\t\tif ( texture.minFilter !== NearestMipmapLinearFilter && texture.minFilter !== LinearMipmapLinearFilter ) return;\n\t\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false ) return; // verify extension for WebGL 1 and WebGL 2\n\t\t\tif ( isWebGL2 === false && ( texture.type === HalfFloatType && extensions.has( 'OES_texture_half_float_linear' ) === false ) ) return; // verify extension for WebGL 1 only\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 initTexture( textureProperties, texture ) {\n\n\t\tlet forceUpload = false;\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}\n\n\t\t// create Source <-> WebGLTextures mapping if necessary\n\n\t\tconst source = texture.source;\n\t\tlet webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures === undefined ) {\n\n\t\t\twebglTextures = {};\n\t\t\t_sources.set( source, webglTextures );\n\n\t\t}\n\n\t\t// check if there is already a WebGLTexture object for the given texture parameters\n\n\t\tconst textureCacheKey = getTextureCacheKey( texture );\n\n\t\tif ( textureCacheKey !== textureProperties.__cacheKey ) {\n\n\t\t\t// if not, create a new instance of WebGLTexture\n\n\t\t\tif ( webglTextures[ textureCacheKey ] === undefined ) {\n\n\t\t\t\t// create new entry\n\n\t\t\t\twebglTextures[ textureCacheKey ] = {\n\t\t\t\t\ttexture: _gl.createTexture(),\n\t\t\t\t\tusedTimes: 0\n\t\t\t\t};\n\n\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t// when a new instance of WebGLTexture was created, a texture upload is required\n\t\t\t\t// even if the image contents are identical\n\n\t\t\t\tforceUpload = true;\n\n\t\t\t}\n\n\t\t\twebglTextures[ textureCacheKey ].usedTimes ++;\n\n\t\t\t// every time the texture cache key changes, it's necessary to check if an instance of\n\t\t\t// WebGLTexture can be deleted in order to avoid a memory leak.\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\n\t\t\tif ( webglTexture !== undefined ) {\n\n\t\t\t\twebglTextures[ textureProperties.__cacheKey ].usedTimes --;\n\n\t\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\t\tdeleteTexture( texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// store references to cache key and WebGLTexture object\n\n\t\t\ttextureProperties.__cacheKey = textureCacheKey;\n\t\t\ttextureProperties.__webglTexture = webglTextures[ textureCacheKey ].texture;\n\n\t\t}\n\n\t\treturn forceUpload;\n\n\t}\n\n\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\tlet textureType = _gl.TEXTURE_2D;\n\n\t\tif ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) textureType = _gl.TEXTURE_2D_ARRAY;\n\t\tif ( texture.isData3DTexture ) textureType = _gl.TEXTURE_3D;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( textureType, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\n\t\t\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\t\t\tconst texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace );\n\t\t\tconst unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );\n\n\t\t\tconst needsPowerOfTwo = textureNeedsPowerOfTwo( texture ) && isPowerOfTwo$1( texture.image ) === false;\n\t\t\tlet image = resizeImage( texture.image, needsPowerOfTwo, false, maxTextureSize );\n\t\t\timage = verifyColorSpace( texture, image );\n\n\t\t\tconst supportsMips = isPowerOfTwo$1( image ) || isWebGL2,\n\t\t\t\tglFormat = utils.convert( texture.format, texture.colorSpace );\n\n\t\t\tlet glType = utils.convert( texture.type ),\n\t\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, texture.isVideoTexture );\n\n\t\t\tsetTextureParameters( textureType, texture, supportsMips );\n\n\t\t\tlet mipmap;\n\t\t\tconst mipmaps = texture.mipmaps;\n\n\t\t\tconst useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst levels = getMipLevels( texture, image, supportsMips );\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\t// populate depth texture with dummy data\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT;\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t\t\t} else if ( texture.type === UnsignedIntType ) {\n\n\t\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT24;\n\n\t\t\t\t\t} else if ( texture.type === UnsignedInt248Type ) {\n\n\t\t\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT16; // WebGL2 requires sized internalformat for glTexImage2D\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\t\tconsole.error( 'WebGLRenderer: Floating point depth texture requires WebGL2.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// validation checks for WebGL 1\n\n\t\t\t\tif ( texture.format === DepthFormat && glInternalFormat === _gl.DEPTH_COMPONENT ) {\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedIntType;\n\t\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( texture.format === DepthStencilFormat && glInternalFormat === _gl.DEPTH_COMPONENT ) {\n\n\t\t\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tglInternalFormat = _gl.DEPTH_STENCIL;\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedInt248Type ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedInt248Type;\n\t\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, 1, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && supportsMips ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, glFormat, glType, image.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\t\tif ( texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, mipmap.data, 0, 0 );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, mipmap.data, 0, 0 );\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\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\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\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 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} else {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\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\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\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\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, 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} else if ( texture.isDataArrayTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_3D, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isFramebufferTexture ) {\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tlet width = image.width, height = image.height;\n\n\t\t\t\t\t\tfor ( let i = 0; i < levels; i ++ ) {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t\t\t\t\twidth >>= 1;\n\t\t\t\t\t\t\theight >>= 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} else {\n\n\t\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && supportsMips ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( textureType );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\tfunction uploadCubeTexture( textureProperties, texture, slot ) {\n\n\t\tif ( texture.image.length !== 6 ) return;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\n\t\t\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\t\t\tconst texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace );\n\t\t\tconst unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );\n\n\t\t\tconst isCompressed = ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture );\n\t\t\tconst isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\tconst cubeImage = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\tcubeImage[ i ] = resizeImage( texture.image[ i ], false, true, maxCubemapSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcubeImage[ i ] = verifyColorSpace( texture, cubeImage[ i ] );\n\n\t\t\t}\n\n\t\t\tconst image = cubeImage[ 0 ],\n\t\t\t\tsupportsMips = isPowerOfTwo$1( image ) || isWebGL2,\n\t\t\t\tglFormat = utils.convert( texture.format, texture.colorSpace ),\n\t\t\t\tglType = utils.convert( texture.type ),\n\t\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\n\t\t\tconst useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tlet levels = getMipLevels( texture, image, supportsMips );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, supportsMips );\n\n\t\t\tlet mipmaps;\n\n\t\t\tif ( isCompressed ) {\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tmipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\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\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );\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\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\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, glInternalFormat, 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} else {\n\n\t\t\t\tmipmaps = texture.mipmaps;\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t// TODO: Uniformly handle mipmap definitions\n\t\t\t\t\t// Normal textures and compressed cube textures define base level + mips with their mipmap array\n\t\t\t\t\t// Uncompressed cube textures use their mipmap array only for mips (no base level)\n\n\t\t\t\t\tif ( mipmaps.length > 0 ) levels ++;\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, cubeImage[ 0 ].width, cubeImage[ 0 ].height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, 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, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\t\t\t\t\t\t\tconst mipmapImage = mipmap.image[ i ].image;\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data );\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 + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.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} else {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] );\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, glInternalFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] );\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 + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\t// We assume images for cube map have the same size.\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\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, texture, attachment, textureTarget, level ) {\n\n\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\tconst glType = utils.convert( texture.type );\n\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( ! renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\tconst width = Math.max( 1, renderTarget.width >> level );\n\t\t\tconst height = Math.max( 1, renderTarget.height >> level );\n\n\t\t\tif ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tstate.texImage3D( textureTarget, level, glInternalFormat, width, height, renderTarget.depth, 0, glFormat, glType, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( textureTarget, level, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0, getRenderTargetSamples( renderTarget ) );\n\n\t\t} else if ( textureTarget === _gl.TEXTURE_2D || ( textureTarget >= _gl.TEXTURE_CUBE_MAP_POSITIVE_X && textureTarget <= _gl.TEXTURE_CUBE_MAP_NEGATIVE_Z ) ) { // see #24753\n\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, level );\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\n\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\tfunction setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\tlet glInternalFormat = ( isWebGL2 === true ) ? _gl.DEPTH_COMPONENT24 : _gl.DEPTH_COMPONENT16;\n\n\t\t\tif ( isMultisample || useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tconst depthTexture = renderTarget.depthTexture;\n\n\t\t\t\tif ( depthTexture && depthTexture.isDepthTexture ) {\n\n\t\t\t\t\tif ( depthTexture.type === FloatType ) {\n\n\t\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t\t\t} else if ( depthTexture.type === UnsignedIntType ) {\n\n\t\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT24;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\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\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\tif ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );\n\n\t\t\t} else if ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t} else {\n\n\t\t\tconst textures = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture : [ renderTarget.texture ];\n\n\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\tconst texture = textures[ i ];\n\n\t\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\tif ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else if ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t}\n\n\t\t\t}\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\tconst isCube = ( renderTarget && renderTarget.isWebGLCubeRenderTarget );\n\t\tif ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );\n\n\t\tstate.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\tconst webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\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\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\n\t\tif ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) {\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 ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tstate.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, false );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// rebind framebuffer with external textures\n\tfunction rebindTextures( renderTarget, colorTexture, depthTexture ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( colorTexture !== undefined ) {\n\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, 0 );\n\n\t\t}\n\n\t\tif ( depthTexture !== undefined ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\t// Set up GL resources for the render target\n\tfunction setupRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tif ( renderTarget.isWebGLMultipleRenderTargets !== true ) {\n\n\t\t\tif ( textureProperties.__webglTexture === undefined ) {\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t}\n\n\t\t\ttextureProperties.__version = texture.version;\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\t\tconst isMultipleRenderTargets = ( renderTarget.isWebGLMultipleRenderTargets === true );\n\t\tconst supportsMips = isPowerOfTwo$1( renderTarget ) || isWebGL2;\n\n\t\t// Setup framebuffer\n\n\t\tif ( isCube ) {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( isWebGL2 && texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = [];\n\n\t\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ][ level ] = _gl.createFramebuffer();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( isWebGL2 && texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ level ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tif ( capabilities.drawBuffers ) {\n\n\t\t\t\t\tconst textures = renderTarget.texture;\n\n\t\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\t\t\t\tif ( attachmentProperties.__webglTexture === undefined ) {\n\n\t\t\t\t\t\t\tattachmentProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t\t\t\tinfo.memory.textures ++;\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\tconsole.warn( 'THREE.WebGLRenderer: WebGLMultipleRenderTargets can only be used with WebGL2 or WEBGL_draw_buffers extension.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ( isWebGL2 && renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\tconst textures = isMultipleRenderTargets ? texture : [ texture ];\n\n\t\t\t\trenderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();\n\t\t\t\trenderTargetProperties.__webglColorRenderbuffer = [];\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tconst texture = textures[ i ];\n\t\t\t\t\trenderTargetProperties.__webglColorRenderbuffer[ i ] = _gl.createRenderbuffer();\n\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, renderTarget.isXRRenderTarget === true );\n\t\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t\t}\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, texture, supportsMips );\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( isWebGL2 && texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ][ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else if ( isMultipleRenderTargets ) {\n\n\t\t\tconst textures = renderTarget.texture;\n\n\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachment = textures[ i ];\n\t\t\t\tconst attachmentProperties = properties.get( attachment );\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, attachmentProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_2D, attachment, supportsMips );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, 0 );\n\n\t\t\t\tif ( textureNeedsGenerateMipmaps( attachment, supportsMips ) ) {\n\n\t\t\t\t\tgenerateMipmap( _gl.TEXTURE_2D );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else {\n\n\t\t\tlet glTextureType = _gl.TEXTURE_2D;\n\n\t\t\tif ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\tglTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLTextures: THREE.Data3DTexture and THREE.DataArrayTexture only supported with WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( glTextureType, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( glTextureType, texture, supportsMips );\n\n\t\t\tif ( isWebGL2 && texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, level );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, 0 );\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\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\tconst supportsMips = isPowerOfTwo$1( renderTarget ) || isWebGL2;\n\n\t\tconst textures = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture : [ renderTarget.texture ];\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst texture = textures[ i ];\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tconst target = renderTarget.isWebGLCubeRenderTarget ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;\n\t\t\t\tconst webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\t\tgenerateMipmap( target );\n\t\t\t\tstate.unbindTexture();\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction updateMultisampleRenderTarget( renderTarget ) {\n\n\t\tif ( ( isWebGL2 && renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\tconst textures = renderTarget.isWebGLMultipleRenderTargets ? renderTarget.texture : [ renderTarget.texture ];\n\t\t\tconst width = renderTarget.width;\n\t\t\tconst height = renderTarget.height;\n\t\t\tlet mask = _gl.COLOR_BUFFER_BIT;\n\t\t\tconst invalidationArray = [];\n\t\t\tconst depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\tconst isMultipleRenderTargets = ( renderTarget.isWebGLMultipleRenderTargets === true );\n\n\t\t\t// If MRT we need to remove FBO attachments\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, null );\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, null, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\tinvalidationArray.push( _gl.COLOR_ATTACHMENT0 + i );\n\n\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\tinvalidationArray.push( depthStyle );\n\n\t\t\t\t}\n\n\t\t\t\tconst ignoreDepthValues = ( renderTargetProperties.__ignoreDepthValues !== undefined ) ? renderTargetProperties.__ignoreDepthValues : false;\n\n\t\t\t\tif ( ignoreDepthValues === false ) {\n\n\t\t\t\t\tif ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;\n\t\t\t\t\tif ( renderTarget.stencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t\t\t}\n\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ignoreDepthValues === true ) {\n\n\t\t\t\t\t_gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, [ depthStyle ] );\n\t\t\t\t\t_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, webglTexture, 0 );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );\n\n\t\t\t\tif ( supportsInvalidateFramebuffer ) {\n\n\t\t\t\t\t_gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArray );\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t// If MRT since pre-blit we removed the FBO we need to reconstruct the attachments\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, webglTexture, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t}\n\n\t}\n\n\tfunction getRenderTargetSamples( renderTarget ) {\n\n\t\treturn Math.min( maxSamples, renderTarget.samples );\n\n\t}\n\n\tfunction useMultisampledRTT( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\treturn isWebGL2 && renderTarget.samples > 0 && extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTargetProperties.__useRenderToTexture !== false;\n\n\t}\n\n\tfunction updateVideoTexture( texture ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\t// Check the last frame we updated the VideoTexture\n\n\t\tif ( _videoTextures.get( texture ) !== frame ) {\n\n\t\t\t_videoTextures.set( texture, frame );\n\t\t\ttexture.update();\n\n\t\t}\n\n\t}\n\n\tfunction verifyColorSpace( texture, image ) {\n\n\t\tconst colorSpace = texture.colorSpace;\n\t\tconst format = texture.format;\n\t\tconst type = texture.type;\n\n\t\tif ( texture.isCompressedTexture === true || texture.isVideoTexture === true || texture.format === _SRGBAFormat ) return image;\n\n\t\tif ( colorSpace !== LinearSRGBColorSpace && colorSpace !== NoColorSpace ) {\n\n\t\t\t// sRGB\n\n\t\t\tif ( ColorManagement.getTransfer( colorSpace ) === SRGBTransfer ) {\n\n\t\t\t\tif ( isWebGL2 === false ) {\n\n\t\t\t\t\t// in WebGL 1, try to use EXT_sRGB extension and unsized formats\n\n\t\t\t\t\tif ( extensions.has( 'EXT_sRGB' ) === true && format === RGBAFormat ) {\n\n\t\t\t\t\t\ttexture.format = _SRGBAFormat;\n\n\t\t\t\t\t\t// it's not possible to generate mips in WebGL 1 with this extension\n\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// slow fallback (CPU decode)\n\n\t\t\t\t\t\timage = ImageUtils.sRGBToLinear( image );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// in WebGL 2 uncompressed textures can only be sRGB encoded if they have the RGBA8 format\n\n\t\t\t\t\tif ( format !== RGBAFormat || type !== UnsignedByteType ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.WebGLTextures: Unsupported texture color space:', colorSpace );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\t//\n\n\tthis.allocateTextureUnit = allocateTextureUnit;\n\tthis.resetTextureUnits = resetTextureUnits;\n\n\tthis.setTexture2D = setTexture2D;\n\tthis.setTexture2DArray = setTexture2DArray;\n\tthis.setTexture3D = setTexture3D;\n\tthis.setTextureCube = setTextureCube;\n\tthis.rebindTextures = rebindTextures;\n\tthis.setupRenderTarget = setupRenderTarget;\n\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\tthis.updateMultisampleRenderTarget = updateMultisampleRenderTarget;\n\tthis.setupDepthRenderbuffer = setupDepthRenderbuffer;\n\tthis.setupFrameBufferTexture = setupFrameBufferTexture;\n\tthis.useMultisampledRTT = useMultisampledRTT;\n\n}\n\nfunction WebGLUtils( gl, extensions, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tfunction convert( p, colorSpace = NoColorSpace ) {\n\n\t\tlet extension;\n\n\t\tconst transfer = ColorManagement.getTransfer( colorSpace );\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\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\tif ( isWebGL2 ) return gl.HALF_FLOAT;\n\n\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.HALF_FLOAT_OES;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === AlphaFormat ) return gl.ALPHA;\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\t// WebGL 1 sRGB fallback\n\n\t\tif ( p === _SRGBAFormat ) {\n\n\t\t\textension = extensions.get( 'EXT_sRGB' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.SRGB_ALPHA_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// WebGL2 formats.\n\n\t\tif ( p === RedFormat ) return gl.RED;\n\t\tif ( p === RedIntegerFormat ) return gl.RED_INTEGER;\n\t\tif ( p === RGFormat ) return gl.RG;\n\t\tif ( p === RGIntegerFormat ) return gl.RG_INTEGER;\n\t\tif ( p === RGBAIntegerFormat ) return gl.RGBA_INTEGER;\n\n\t\t// S3TC\n\n\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\tif ( transfer === SRGBTransfer ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc_srgb' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// PVRTC\n\n\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === 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} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC1\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 ) {\n\n\t\t\t\treturn extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC2\n\n\t\tif ( p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_ETC2_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;\n\t\t\t\tif ( p === RGBA_ETC2_EAC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ASTC\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\tif ( p === RGBA_ASTC_4x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x12_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// BPTC\n\n\t\tif ( p === RGBA_BPTC_Format || p === RGB_BPTC_SIGNED_Format || p === RGB_BPTC_UNSIGNED_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_bptc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_BPTC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT;\n\t\t\t\tif ( p === RGB_BPTC_SIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;\n\t\t\t\tif ( p === RGB_BPTC_UNSIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// RGTC\n\n\t\tif ( p === RED_RGTC1_Format || p === SIGNED_RED_RGTC1_Format || p === RED_GREEN_RGTC2_Format || p === SIGNED_RED_GREEN_RGTC2_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_rgtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_BPTC_Format ) return extension.COMPRESSED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === SIGNED_RED_RGTC1_Format ) return extension.COMPRESSED_SIGNED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_RED_GREEN_RGTC2_EXT;\n\t\t\t\tif ( p === SIGNED_RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\tif ( isWebGL2 ) return gl.UNSIGNED_INT_24_8;\n\n\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// if \"p\" can't be resolved, assume the user defines a WebGL constant as a string (fallback/workaround for packed RGB formats)\n\n\t\treturn ( gl[ p ] !== undefined ) ? gl[ p ] : null;\n\n\t}\n\n\treturn { convert: convert };\n\n}\n\nclass ArrayCamera extends PerspectiveCamera {\n\n\tconstructor( array = [] ) {\n\n\t\tsuper();\n\n\t\tthis.isArrayCamera = true;\n\n\t\tthis.cameras = array;\n\n\t}\n\n}\n\nclass Group extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isGroup = true;\n\n\t\tthis.type = 'Group';\n\n\t}\n\n}\n\nconst _moveEvent = { type: 'move' };\n\nclass WebXRController {\n\n\tconstructor() {\n\n\t\tthis._targetRay = null;\n\t\tthis._grip = null;\n\t\tthis._hand = null;\n\n\t}\n\n\tgetHandSpace() {\n\n\t\tif ( this._hand === null ) {\n\n\t\t\tthis._hand = new Group();\n\t\t\tthis._hand.matrixAutoUpdate = false;\n\t\t\tthis._hand.visible = false;\n\n\t\t\tthis._hand.joints = {};\n\t\t\tthis._hand.inputState = { pinching: false };\n\n\t\t}\n\n\t\treturn this._hand;\n\n\t}\n\n\tgetTargetRaySpace() {\n\n\t\tif ( this._targetRay === null ) {\n\n\t\t\tthis._targetRay = new Group();\n\t\t\tthis._targetRay.matrixAutoUpdate = false;\n\t\t\tthis._targetRay.visible = false;\n\t\t\tthis._targetRay.hasLinearVelocity = false;\n\t\t\tthis._targetRay.linearVelocity = new Vector3();\n\t\t\tthis._targetRay.hasAngularVelocity = false;\n\t\t\tthis._targetRay.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._targetRay;\n\n\t}\n\n\tgetGripSpace() {\n\n\t\tif ( this._grip === null ) {\n\n\t\t\tthis._grip = new Group();\n\t\t\tthis._grip.matrixAutoUpdate = false;\n\t\t\tthis._grip.visible = false;\n\t\t\tthis._grip.hasLinearVelocity = false;\n\t\t\tthis._grip.linearVelocity = new Vector3();\n\t\t\tthis._grip.hasAngularVelocity = false;\n\t\t\tthis._grip.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._grip;\n\n\t}\n\n\tdispatchEvent( event ) {\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.dispatchEvent( event );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tconnect( inputSource ) {\n\n\t\tif ( inputSource && inputSource.hand ) {\n\n\t\t\tconst hand = this._hand;\n\n\t\t\tif ( hand ) {\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Initialize hand with joints when connected\n\t\t\t\t\tthis._getHandJoint( hand, inputjoint );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.dispatchEvent( { type: 'connected', data: inputSource } );\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect( inputSource ) {\n\n\t\tthis.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.visible = false;\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.visible = false;\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.visible = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tupdate( inputSource, frame, referenceSpace ) {\n\n\t\tlet inputPose = null;\n\t\tlet gripPose = null;\n\t\tlet handPose = null;\n\n\t\tconst targetRay = this._targetRay;\n\t\tconst grip = this._grip;\n\t\tconst hand = this._hand;\n\n\t\tif ( inputSource && frame.session.visibilityState !== 'visible-blurred' ) {\n\n\t\t\tif ( hand && inputSource.hand ) {\n\n\t\t\t\thandPose = true;\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Update the joints groups with the XRJoint poses\n\t\t\t\t\tconst jointPose = frame.getJointPose( inputjoint, referenceSpace );\n\n\t\t\t\t\t// The transform of this joint will be updated with the joint pose on each frame\n\t\t\t\t\tconst joint = this._getHandJoint( hand, inputjoint );\n\n\t\t\t\t\tif ( jointPose !== null ) {\n\n\t\t\t\t\t\tjoint.matrix.fromArray( jointPose.transform.matrix );\n\t\t\t\t\t\tjoint.matrix.decompose( joint.position, joint.rotation, joint.scale );\n\t\t\t\t\t\tjoint.matrixWorldNeedsUpdate = true;\n\t\t\t\t\t\tjoint.jointRadius = jointPose.radius;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tjoint.visible = jointPose !== null;\n\n\t\t\t\t}\n\n\t\t\t\t// Custom events\n\n\t\t\t\t// Check pinchz\n\t\t\t\tconst indexTip = hand.joints[ 'index-finger-tip' ];\n\t\t\t\tconst thumbTip = hand.joints[ 'thumb-tip' ];\n\t\t\t\tconst distance = indexTip.position.distanceTo( thumbTip.position );\n\n\t\t\t\tconst distanceToPinch = 0.02;\n\t\t\t\tconst threshold = 0.005;\n\n\t\t\t\tif ( hand.inputState.pinching && distance > distanceToPinch + threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = false;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchend',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t} else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = true;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchstart',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( grip !== null && inputSource.gripSpace ) {\n\n\t\t\t\t\tgripPose = frame.getPose( inputSource.gripSpace, referenceSpace );\n\n\t\t\t\t\tif ( gripPose !== null ) {\n\n\t\t\t\t\t\tgrip.matrix.fromArray( gripPose.transform.matrix );\n\t\t\t\t\t\tgrip.matrix.decompose( grip.position, grip.rotation, grip.scale );\n\t\t\t\t\t\tgrip.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t\t\tif ( gripPose.linearVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = true;\n\t\t\t\t\t\t\tgrip.linearVelocity.copy( gripPose.linearVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( gripPose.angularVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = true;\n\t\t\t\t\t\t\tgrip.angularVelocity.copy( gripPose.angularVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = false;\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\tif ( targetRay !== null ) {\n\n\t\t\t\tinputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace );\n\n\t\t\t\t// Some runtimes (namely Vive Cosmos with Vive OpenXR Runtime) have only grip space and ray space is equal to it\n\t\t\t\tif ( inputPose === null && gripPose !== null ) {\n\n\t\t\t\t\tinputPose = gripPose;\n\n\t\t\t\t}\n\n\t\t\t\tif ( inputPose !== null ) {\n\n\t\t\t\t\ttargetRay.matrix.fromArray( inputPose.transform.matrix );\n\t\t\t\t\ttargetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale );\n\t\t\t\t\ttargetRay.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t\tif ( inputPose.linearVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = true;\n\t\t\t\t\t\ttargetRay.linearVelocity.copy( inputPose.linearVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( inputPose.angularVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = true;\n\t\t\t\t\t\ttargetRay.angularVelocity.copy( inputPose.angularVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.dispatchEvent( _moveEvent );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t}\n\n\t\tif ( targetRay !== null ) {\n\n\t\t\ttargetRay.visible = ( inputPose !== null );\n\n\t\t}\n\n\t\tif ( grip !== null ) {\n\n\t\t\tgrip.visible = ( gripPose !== null );\n\n\t\t}\n\n\t\tif ( hand !== null ) {\n\n\t\t\thand.visible = ( handPose !== null );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// private method\n\n\t_getHandJoint( hand, inputjoint ) {\n\n\t\tif ( hand.joints[ inputjoint.jointName ] === undefined ) {\n\n\t\t\tconst joint = new Group();\n\t\t\tjoint.matrixAutoUpdate = false;\n\t\t\tjoint.visible = false;\n\t\t\thand.joints[ inputjoint.jointName ] = joint;\n\n\t\t\thand.add( joint );\n\n\t\t}\n\n\t\treturn hand.joints[ inputjoint.jointName ];\n\n\t}\n\n}\n\nclass DepthTexture extends Texture {\n\n\tconstructor( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {\n\n\t\tformat = format !== undefined ? format : DepthFormat;\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );\n\n\t\t}\n\n\t\tif ( type === undefined && format === DepthFormat ) type = UnsignedIntType;\n\t\tif ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.isDepthTexture = true;\n\n\t\tthis.image = { width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.flipY = false;\n\t\tthis.generateMipmaps = false;\n\n\t\tthis.compareFunction = null;\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.compareFunction = source.compareFunction;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.compareFunction !== null ) data.compareFunction = this.compareFunction;\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass WebXRManager extends EventDispatcher {\n\n\tconstructor( renderer, gl ) {\n\n\t\tsuper();\n\n\t\tconst scope = this;\n\n\t\tlet session = null;\n\n\t\tlet framebufferScaleFactor = 1.0;\n\n\t\tlet referenceSpace = null;\n\t\tlet referenceSpaceType = 'local-floor';\n\t\t// Set default foveation to maximum.\n\t\tlet foveation = 1.0;\n\t\tlet customReferenceSpace = null;\n\n\t\tlet pose = null;\n\t\tlet glBinding = null;\n\t\tlet glProjLayer = null;\n\t\tlet glBaseLayer = null;\n\t\tlet xrFrame = null;\n\t\tconst attributes = gl.getContextAttributes();\n\t\tlet initialRenderTarget = null;\n\t\tlet newRenderTarget = null;\n\n\t\tconst controllers = [];\n\t\tconst controllerInputSources = [];\n\n\t\t//\n\n\t\tconst cameraL = new PerspectiveCamera();\n\t\tcameraL.layers.enable( 1 );\n\t\tcameraL.viewport = new Vector4();\n\n\t\tconst cameraR = new PerspectiveCamera();\n\t\tcameraR.layers.enable( 2 );\n\t\tcameraR.viewport = new Vector4();\n\n\t\tconst cameras = [ cameraL, cameraR ];\n\n\t\tconst cameraXR = new ArrayCamera();\n\t\tcameraXR.layers.enable( 1 );\n\t\tcameraXR.layers.enable( 2 );\n\n\t\tlet _currentDepthNear = null;\n\t\tlet _currentDepthFar = null;\n\n\t\t//\n\n\t\tthis.cameraAutoUpdate = true;\n\t\tthis.enabled = false;\n\n\t\tthis.isPresenting = false;\n\n\t\tthis.getController = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getTargetRaySpace();\n\n\t\t};\n\n\t\tthis.getControllerGrip = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getGripSpace();\n\n\t\t};\n\n\t\tthis.getHand = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getHandSpace();\n\n\t\t};\n\n\t\t//\n\n\t\tfunction onSessionEvent( event ) {\n\n\t\t\tconst controllerIndex = controllerInputSources.indexOf( event.inputSource );\n\n\t\t\tif ( controllerIndex === - 1 ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\tif ( controller !== undefined ) {\n\n\t\t\t\tcontroller.update( event.inputSource, event.frame, customReferenceSpace || referenceSpace );\n\t\t\t\tcontroller.dispatchEvent( { type: event.type, data: event.inputSource } );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onSessionEnd() {\n\n\t\t\tsession.removeEventListener( 'select', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectstart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeeze', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezestart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezeend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'end', onSessionEnd );\n\t\t\tsession.removeEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\n\t\t\t\tif ( inputSource === null ) continue;\n\n\t\t\t\tcontrollerInputSources[ i ] = null;\n\n\t\t\t\tcontrollers[ i ].disconnect( inputSource );\n\n\t\t\t}\n\n\t\t\t_currentDepthNear = null;\n\t\t\t_currentDepthFar = null;\n\n\t\t\t// restore framebuffer/rendering state\n\n\t\t\trenderer.setRenderTarget( initialRenderTarget );\n\n\t\t\tglBaseLayer = null;\n\t\t\tglProjLayer = null;\n\t\t\tglBinding = null;\n\t\t\tsession = null;\n\t\t\tnewRenderTarget = null;\n\n\t\t\t//\n\n\t\t\tanimation.stop();\n\n\t\t\tscope.isPresenting = false;\n\n\t\t\tscope.dispatchEvent( { type: 'sessionend' } );\n\n\t\t}\n\n\t\tthis.setFramebufferScaleFactor = function ( value ) {\n\n\t\t\tframebufferScaleFactor = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change framebuffer scale while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.setReferenceSpaceType = function ( value ) {\n\n\t\t\treferenceSpaceType = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change reference space type while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getReferenceSpace = function () {\n\n\t\t\treturn customReferenceSpace || referenceSpace;\n\n\t\t};\n\n\t\tthis.setReferenceSpace = function ( space ) {\n\n\t\t\tcustomReferenceSpace = space;\n\n\t\t};\n\n\t\tthis.getBaseLayer = function () {\n\n\t\t\treturn glProjLayer !== null ? glProjLayer : glBaseLayer;\n\n\t\t};\n\n\t\tthis.getBinding = function () {\n\n\t\t\treturn glBinding;\n\n\t\t};\n\n\t\tthis.getFrame = function () {\n\n\t\t\treturn xrFrame;\n\n\t\t};\n\n\t\tthis.getSession = function () {\n\n\t\t\treturn session;\n\n\t\t};\n\n\t\tthis.setSession = async function ( value ) {\n\n\t\t\tsession = value;\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\tinitialRenderTarget = renderer.getRenderTarget();\n\n\t\t\t\tsession.addEventListener( 'select', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectstart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeeze', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezestart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezeend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'end', onSessionEnd );\n\t\t\t\tsession.addEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\t\tif ( attributes.xrCompatible !== true ) {\n\n\t\t\t\t\tawait gl.makeXRCompatible();\n\n\t\t\t\t}\n\n\t\t\t\tif ( ( session.renderState.layers === undefined ) || ( renderer.capabilities.isWebGL2 === false ) ) {\n\n\t\t\t\t\tconst layerInit = {\n\t\t\t\t\t\tantialias: ( session.renderState.layers === undefined ) ? attributes.antialias : true,\n\t\t\t\t\t\talpha: true,\n\t\t\t\t\t\tdepth: attributes.depth,\n\t\t\t\t\t\tstencil: attributes.stencil,\n\t\t\t\t\t\tframebufferScaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBaseLayer = new XRWebGLLayer( session, gl, layerInit );\n\n\t\t\t\t\tsession.updateRenderState( { baseLayer: glBaseLayer } );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglBaseLayer.framebufferWidth,\n\t\t\t\t\t\tglBaseLayer.framebufferHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlet depthFormat = null;\n\t\t\t\t\tlet depthType = null;\n\t\t\t\t\tlet glDepthFormat = null;\n\n\t\t\t\t\tif ( attributes.depth ) {\n\n\t\t\t\t\t\tglDepthFormat = attributes.stencil ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24;\n\t\t\t\t\t\tdepthFormat = attributes.stencil ? DepthStencilFormat : DepthFormat;\n\t\t\t\t\t\tdepthType = attributes.stencil ? UnsignedInt248Type : UnsignedIntType;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst projectionlayerInit = {\n\t\t\t\t\t\tcolorFormat: gl.RGBA8,\n\t\t\t\t\t\tdepthFormat: glDepthFormat,\n\t\t\t\t\t\tscaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBinding = new XRWebGLBinding( session, gl );\n\n\t\t\t\t\tglProjLayer = glBinding.createProjectionLayer( projectionlayerInit );\n\n\t\t\t\t\tsession.updateRenderState( { layers: [ glProjLayer ] } );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglProjLayer.textureWidth,\n\t\t\t\t\t\tglProjLayer.textureHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tdepthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\t\tsamples: attributes.antialias ? 4 : 0\n\t\t\t\t\t\t} );\n\n\t\t\t\t\tconst renderTargetProperties = renderer.properties.get( newRenderTarget );\n\t\t\t\t\trenderTargetProperties.__ignoreDepthValues = glProjLayer.ignoreDepthValues;\n\n\t\t\t\t}\n\n\t\t\t\tnewRenderTarget.isXRRenderTarget = true; // TODO Remove this when possible, see #23278\n\n\t\t\t\tthis.setFoveation( foveation );\n\n\t\t\t\tcustomReferenceSpace = null;\n\t\t\t\treferenceSpace = await session.requestReferenceSpace( referenceSpaceType );\n\n\t\t\t\tanimation.setContext( session );\n\t\t\t\tanimation.start();\n\n\t\t\t\tscope.isPresenting = true;\n\n\t\t\t\tscope.dispatchEvent( { type: 'sessionstart' } );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getEnvironmentBlendMode = function () {\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\treturn session.environmentBlendMode;\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction onInputSourcesChange( event ) {\n\n\t\t\t// Notify disconnected\n\n\t\t\tfor ( let i = 0; i < event.removed.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.removed[ i ];\n\t\t\t\tconst index = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( index >= 0 ) {\n\n\t\t\t\t\tcontrollerInputSources[ index ] = null;\n\t\t\t\t\tcontrollers[ index ].disconnect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Notify connected\n\n\t\t\tfor ( let i = 0; i < event.added.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.added[ i ];\n\n\t\t\t\tlet controllerIndex = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( controllerIndex === - 1 ) {\n\n\t\t\t\t\t// Assign input source a controller that currently has no input source\n\n\t\t\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\t\t\tif ( i >= controllerInputSources.length ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources.push( inputSource );\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t} else if ( controllerInputSources[ i ] === null ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources[ i ] = inputSource;\n\t\t\t\t\t\t\tcontrollerIndex = 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\t// If all controllers do currently receive input we ignore new ones\n\n\t\t\t\t\tif ( controllerIndex === - 1 ) break;\n\n\t\t\t\t}\n\n\t\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\t\tif ( controller ) {\n\n\t\t\t\t\tcontroller.connect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst cameraLPos = new Vector3();\n\t\tconst cameraRPos = new Vector3();\n\n\t\t/**\n\t\t * Assumes 2 cameras that are parallel and share an X-axis, and that\n\t\t * the cameras' projection and world matrices have already been set.\n\t\t * And that near and far planes are identical for both cameras.\n\t\t * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765\n\t\t */\n\t\tfunction setProjectionFromUnion( camera, cameraL, cameraR ) {\n\n\t\t\tcameraLPos.setFromMatrixPosition( cameraL.matrixWorld );\n\t\t\tcameraRPos.setFromMatrixPosition( cameraR.matrixWorld );\n\n\t\t\tconst ipd = cameraLPos.distanceTo( cameraRPos );\n\n\t\t\tconst projL = cameraL.projectionMatrix.elements;\n\t\t\tconst projR = cameraR.projectionMatrix.elements;\n\n\t\t\t// VR systems will have identical far and near planes, and\n\t\t\t// most likely identical top and bottom frustum extents.\n\t\t\t// Use the left camera for these values.\n\t\t\tconst near = projL[ 14 ] / ( projL[ 10 ] - 1 );\n\t\t\tconst far = projL[ 14 ] / ( projL[ 10 ] + 1 );\n\t\t\tconst topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ];\n\t\t\tconst bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ];\n\n\t\t\tconst leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ];\n\t\t\tconst rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ];\n\t\t\tconst left = near * leftFov;\n\t\t\tconst right = near * rightFov;\n\n\t\t\t// Calculate the new camera's position offset from the\n\t\t\t// left camera. xOffset should be roughly half `ipd`.\n\t\t\tconst zOffset = ipd / ( - leftFov + rightFov );\n\t\t\tconst xOffset = zOffset * - leftFov;\n\n\t\t\t// TODO: Better way to apply this offset?\n\t\t\tcameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.translateX( xOffset );\n\t\t\tcamera.translateZ( zOffset );\n\t\t\tcamera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t\t// Find the union of the frustum values of the cameras and scale\n\t\t\t// the values so that the near plane's position does not change in world space,\n\t\t\t// although must now be relative to the new union camera.\n\t\t\tconst near2 = near + zOffset;\n\t\t\tconst far2 = far + zOffset;\n\t\t\tconst left2 = left - xOffset;\n\t\t\tconst right2 = right + ( ipd - xOffset );\n\t\t\tconst top2 = topFov * far / far2 * near2;\n\t\t\tconst bottom2 = bottomFov * far / far2 * near2;\n\n\t\t\tcamera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );\n\t\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\n\t\t}\n\n\t\tfunction updateCamera( camera, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrixWorld.copy( camera.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );\n\n\t\t\t}\n\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t}\n\n\t\tthis.updateCamera = function ( camera ) {\n\n\t\t\tif ( session === null ) return;\n\n\t\t\tcameraXR.near = cameraR.near = cameraL.near = camera.near;\n\t\t\tcameraXR.far = cameraR.far = cameraL.far = camera.far;\n\n\t\t\tif ( _currentDepthNear !== cameraXR.near || _currentDepthFar !== cameraXR.far ) {\n\n\t\t\t\t// Note that the new renderState won't apply until the next frame. See #18320\n\n\t\t\t\tsession.updateRenderState( {\n\t\t\t\t\tdepthNear: cameraXR.near,\n\t\t\t\t\tdepthFar: cameraXR.far\n\t\t\t\t} );\n\n\t\t\t\t_currentDepthNear = cameraXR.near;\n\t\t\t\t_currentDepthFar = cameraXR.far;\n\n\t\t\t}\n\n\t\t\tconst parent = camera.parent;\n\t\t\tconst cameras = cameraXR.cameras;\n\n\t\t\tupdateCamera( cameraXR, parent );\n\n\t\t\tfor ( let i = 0; i < cameras.length; i ++ ) {\n\n\t\t\t\tupdateCamera( cameras[ i ], parent );\n\n\t\t\t}\n\n\t\t\t// update projection matrix for proper view frustum culling\n\n\t\t\tif ( cameras.length === 2 ) {\n\n\t\t\t\tsetProjectionFromUnion( cameraXR, cameraL, cameraR );\n\n\t\t\t} else {\n\n\t\t\t\t// assume single camera setup (AR)\n\n\t\t\t\tcameraXR.projectionMatrix.copy( cameraL.projectionMatrix );\n\n\t\t\t}\n\n\t\t\t// update user camera and its children\n\n\t\t\tupdateUserCamera( camera, cameraXR, parent );\n\n\t\t};\n\n\t\tfunction updateUserCamera( camera, cameraXR, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrix.copy( cameraXR.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrix.copy( parent.matrixWorld );\n\t\t\t\tcamera.matrix.invert();\n\t\t\t\tcamera.matrix.multiply( cameraXR.matrixWorld );\n\n\t\t\t}\n\n\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.updateMatrixWorld( true );\n\n\t\t\tcamera.projectionMatrix.copy( cameraXR.projectionMatrix );\n\t\t\tcamera.projectionMatrixInverse.copy( cameraXR.projectionMatrixInverse );\n\n\t\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\t\tcamera.fov = RAD2DEG * 2 * Math.atan( 1 / camera.projectionMatrix.elements[ 5 ] );\n\t\t\t\tcamera.zoom = 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.getCamera = function () {\n\n\t\t\treturn cameraXR;\n\n\t\t};\n\n\t\tthis.getFoveation = function () {\n\n\t\t\tif ( glProjLayer === null && glBaseLayer === null ) {\n\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t\treturn foveation;\n\n\t\t};\n\n\t\tthis.setFoveation = function ( value ) {\n\n\t\t\t// 0 = no foveation = full resolution\n\t\t\t// 1 = maximum foveation = the edges render at lower resolution\n\n\t\t\tfoveation = value;\n\n\t\t\tif ( glProjLayer !== null ) {\n\n\t\t\t\tglProjLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t\tif ( glBaseLayer !== null && glBaseLayer.fixedFoveation !== undefined ) {\n\n\t\t\t\tglBaseLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time, frame ) {\n\n\t\t\tpose = frame.getViewerPose( customReferenceSpace || referenceSpace );\n\t\t\txrFrame = frame;\n\n\t\t\tif ( pose !== null ) {\n\n\t\t\t\tconst views = pose.views;\n\n\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\trenderer.setRenderTargetFramebuffer( newRenderTarget, glBaseLayer.framebuffer );\n\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t\tlet cameraXRNeedsUpdate = false;\n\n\t\t\t\t// check if it's necessary to rebuild cameraXR's camera list\n\n\t\t\t\tif ( views.length !== cameraXR.cameras.length ) {\n\n\t\t\t\t\tcameraXR.cameras.length = 0;\n\t\t\t\t\tcameraXRNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\tconst view = views[ i ];\n\n\t\t\t\t\tlet viewport = null;\n\n\t\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\t\tviewport = glBaseLayer.getViewport( view );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst glSubImage = glBinding.getViewSubImage( glProjLayer, view );\n\t\t\t\t\t\tviewport = glSubImage.viewport;\n\n\t\t\t\t\t\t// For side-by-side projection, we only produce a single texture for both eyes.\n\t\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\t\trenderer.setRenderTargetTextures(\n\t\t\t\t\t\t\t\tnewRenderTarget,\n\t\t\t\t\t\t\t\tglSubImage.colorTexture,\n\t\t\t\t\t\t\t\tglProjLayer.ignoreDepthValues ? undefined : glSubImage.depthStencilTexture );\n\n\t\t\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet camera = cameras[ i ];\n\n\t\t\t\t\tif ( camera === undefined ) {\n\n\t\t\t\t\t\tcamera = new PerspectiveCamera();\n\t\t\t\t\t\tcamera.layers.enable( i );\n\t\t\t\t\t\tcamera.viewport = new Vector4();\n\t\t\t\t\t\tcameras[ i ] = camera;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcamera.matrix.fromArray( view.transform.matrix );\n\t\t\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\t\t\tcamera.projectionMatrix.fromArray( view.projectionMatrix );\n\t\t\t\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\t\t\t\t\tcamera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );\n\n\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\tcameraXR.matrix.copy( camera.matrix );\n\t\t\t\t\t\tcameraXR.matrix.decompose( cameraXR.position, cameraXR.quaternion, cameraXR.scale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( cameraXRNeedsUpdate === true ) {\n\n\t\t\t\t\t\tcameraXR.cameras.push( camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\t\t\t\tconst controller = controllers[ i ];\n\n\t\t\t\tif ( inputSource !== null && controller !== undefined ) {\n\n\t\t\t\t\tcontroller.update( inputSource, frame, customReferenceSpace || referenceSpace );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame );\n\n\t\t\tif ( frame.detectedPlanes ) {\n\n\t\t\t\tscope.dispatchEvent( { type: 'planesdetected', data: frame } );\n\n\t\t\t}\n\n\t\t\txrFrame = null;\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\n\t\t};\n\n\t\tthis.dispose = function () {};\n\n\t}\n\n}\n\nfunction WebGLMaterials( renderer, properties ) {\n\n\tfunction refreshTransformUniform( map, uniform ) {\n\n\t\tif ( map.matrixAutoUpdate === true ) {\n\n\t\t\tmap.updateMatrix();\n\n\t\t}\n\n\t\tuniform.value.copy( map.matrix );\n\n\t}\n\n\tfunction refreshFogUniforms( uniforms, fog ) {\n\n\t\tfog.color.getRGB( uniforms.fogColor.value, getUnlitUniformColorSpace( renderer ) );\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 refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) {\n\n\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsToon( uniforms, material );\n\n\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\trefreshUniformsPhysical( uniforms, material, transmissionRenderTarget );\n\n\t\t\t}\n\n\t\t} else if ( material.isMeshMatcapMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsMatcap( uniforms, material );\n\n\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshDistanceMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDistance( uniforms, material );\n\n\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isLineBasicMaterial ) {\n\n\t\t\trefreshUniformsLine( uniforms, material );\n\n\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\trefreshUniformsDash( uniforms, material );\n\n\t\t\t}\n\n\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\trefreshUniformsPoints( uniforms, material, pixelRatio, height );\n\n\t\t} else if ( material.isSpriteMaterial ) {\n\n\t\t\trefreshUniformsSprites( uniforms, material );\n\n\t\t} else if ( material.isShadowMaterial ) {\n\n\t\t\tuniforms.color.value.copy( material.color );\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t} else if ( material.isShaderMaterial ) {\n\n\t\t\tmaterial.uniformsNeedUpdate = false; // #15581\n\n\t\t}\n\n\t}\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.copy( 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\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\n\t\t\trefreshTransformUniform( material.bumpMap, uniforms.bumpMapTransform );\n\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.bumpScale.value *= - 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\n\t\t\trefreshTransformUniform( material.normalMap, uniforms.normalMapTransform );\n\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.normalScale.value.negate();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\n\t\t\trefreshTransformUniform( material.displacementMap, uniforms.displacementMapTransform );\n\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.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\trefreshTransformUniform( material.emissiveMap, uniforms.emissiveMapTransform );\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\n\t\t\trefreshTransformUniform( material.specularMap, uniforms.specularMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\tconst envMap = properties.get( material ).envMap;\n\n\t\tif ( envMap ) {\n\n\t\t\tuniforms.envMap.value = envMap;\n\n\t\t\tuniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.ior.value = material.ior;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tif ( material.lightMap ) {\n\n\t\t\tuniforms.lightMap.value = material.lightMap;\n\n\t\t\t// artist-friendly light intensity scaling factor\n\t\t\tconst scaleFactor = ( renderer._useLegacyLights === true ) ? Math.PI : 1;\n\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity * scaleFactor;\n\n\t\t\trefreshTransformUniform( material.lightMap, uniforms.lightMapTransform );\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\trefreshTransformUniform( material.aoMap, uniforms.aoMapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\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, pixelRatio, height ) {\n\n\t\tuniforms.diffuse.value.copy( 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\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.uvTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsSprites( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.rotation.value = material.rotation;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\tuniforms.specular.value.copy( material.specular );\n\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t}\n\n\tfunction refreshUniformsToon( 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.metalness.value = material.metalness;\n\n\t\tif ( material.metalnessMap ) {\n\n\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\trefreshTransformUniform( material.metalnessMap, uniforms.metalnessMapTransform );\n\n\t\t}\n\n\t\tuniforms.roughness.value = material.roughness;\n\n\t\tif ( material.roughnessMap ) {\n\n\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\trefreshTransformUniform( material.roughnessMap, uniforms.roughnessMapTransform );\n\n\t\t}\n\n\t\tconst envMap = properties.get( material ).envMap;\n\n\t\tif ( 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, transmissionRenderTarget ) {\n\n\t\tuniforms.ior.value = material.ior; // also part of uniforms common\n\n\t\tif ( material.sheen > 0 ) {\n\n\t\t\tuniforms.sheenColor.value.copy( material.sheenColor ).multiplyScalar( material.sheen );\n\n\t\t\tuniforms.sheenRoughness.value = material.sheenRoughness;\n\n\t\t\tif ( material.sheenColorMap ) {\n\n\t\t\t\tuniforms.sheenColorMap.value = material.sheenColorMap;\n\n\t\t\t\trefreshTransformUniform( material.sheenColorMap, uniforms.sheenColorMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.sheenRoughnessMap ) {\n\n\t\t\t\tuniforms.sheenRoughnessMap.value = material.sheenRoughnessMap;\n\n\t\t\t\trefreshTransformUniform( material.sheenRoughnessMap, uniforms.sheenRoughnessMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.clearcoat > 0 ) {\n\n\t\t\tuniforms.clearcoat.value = material.clearcoat;\n\t\t\tuniforms.clearcoatRoughness.value = material.clearcoatRoughness;\n\n\t\t\tif ( material.clearcoatMap ) {\n\n\t\t\t\tuniforms.clearcoatMap.value = material.clearcoatMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatMap, uniforms.clearcoatMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatRoughnessMap ) {\n\n\t\t\t\tuniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatRoughnessMap, uniforms.clearcoatRoughnessMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\t\tuniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatNormalMap, uniforms.clearcoatNormalMapTransform );\n\n\t\t\t\tuniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tuniforms.clearcoatNormalScale.value.negate();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.iridescence > 0 ) {\n\n\t\t\tuniforms.iridescence.value = material.iridescence;\n\t\t\tuniforms.iridescenceIOR.value = material.iridescenceIOR;\n\t\t\tuniforms.iridescenceThicknessMinimum.value = material.iridescenceThicknessRange[ 0 ];\n\t\t\tuniforms.iridescenceThicknessMaximum.value = material.iridescenceThicknessRange[ 1 ];\n\n\t\t\tif ( material.iridescenceMap ) {\n\n\t\t\t\tuniforms.iridescenceMap.value = material.iridescenceMap;\n\n\t\t\t\trefreshTransformUniform( material.iridescenceMap, uniforms.iridescenceMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.iridescenceThicknessMap ) {\n\n\t\t\t\tuniforms.iridescenceThicknessMap.value = material.iridescenceThicknessMap;\n\n\t\t\t\trefreshTransformUniform( material.iridescenceThicknessMap, uniforms.iridescenceThicknessMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.transmission > 0 ) {\n\n\t\t\tuniforms.transmission.value = material.transmission;\n\t\t\tuniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture;\n\t\t\tuniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height );\n\n\t\t\tif ( material.transmissionMap ) {\n\n\t\t\t\tuniforms.transmissionMap.value = material.transmissionMap;\n\n\t\t\t\trefreshTransformUniform( material.transmissionMap, uniforms.transmissionMapTransform );\n\n\t\t\t}\n\n\t\t\tuniforms.thickness.value = material.thickness;\n\n\t\t\tif ( material.thicknessMap ) {\n\n\t\t\t\tuniforms.thicknessMap.value = material.thicknessMap;\n\n\t\t\t\trefreshTransformUniform( material.thicknessMap, uniforms.thicknessMapTransform );\n\n\t\t\t}\n\n\t\t\tuniforms.attenuationDistance.value = material.attenuationDistance;\n\t\t\tuniforms.attenuationColor.value.copy( material.attenuationColor );\n\n\t\t}\n\n\t\tif ( material.anisotropy > 0 ) {\n\n\t\t\tuniforms.anisotropyVector.value.set( material.anisotropy * Math.cos( material.anisotropyRotation ), material.anisotropy * Math.sin( material.anisotropyRotation ) );\n\n\t\t\tif ( material.anisotropyMap ) {\n\n\t\t\t\tuniforms.anisotropyMap.value = material.anisotropyMap;\n\n\t\t\t\trefreshTransformUniform( material.anisotropyMap, uniforms.anisotropyMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tuniforms.specularIntensity.value = material.specularIntensity;\n\t\tuniforms.specularColor.value.copy( material.specularColor );\n\n\t\tif ( material.specularColorMap ) {\n\n\t\t\tuniforms.specularColorMap.value = material.specularColorMap;\n\n\t\t\trefreshTransformUniform( material.specularColorMap, uniforms.specularColorMapTransform );\n\n\t\t}\n\n\t\tif ( material.specularIntensityMap ) {\n\n\t\t\tuniforms.specularIntensityMap.value = material.specularIntensityMap;\n\n\t\t\trefreshTransformUniform( material.specularIntensityMap, uniforms.specularIntensityMapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsMatcap( uniforms, material ) {\n\n\t\tif ( material.matcap ) {\n\n\t\t\tuniforms.matcap.value = material.matcap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDistance( uniforms, material ) {\n\n\t\tconst light = properties.get( material ).light;\n\n\t\tuniforms.referencePosition.value.setFromMatrixPosition( light.matrixWorld );\n\t\tuniforms.nearDistance.value = light.shadow.camera.near;\n\t\tuniforms.farDistance.value = light.shadow.camera.far;\n\n\t}\n\n\treturn {\n\t\trefreshFogUniforms: refreshFogUniforms,\n\t\trefreshMaterialUniforms: refreshMaterialUniforms\n\t};\n\n}\n\nfunction WebGLUniformsGroups( gl, info, capabilities, state ) {\n\n\tlet buffers = {};\n\tlet updateList = {};\n\tlet allocatedBindingPoints = [];\n\n\tconst maxBindingPoints = ( capabilities.isWebGL2 ) ? gl.getParameter( gl.MAX_UNIFORM_BUFFER_BINDINGS ) : 0; // binding points are global whereas block indices are per shader program\n\n\tfunction bind( uniformsGroup, program ) {\n\n\t\tconst webglProgram = program.program;\n\t\tstate.uniformBlockBinding( uniformsGroup, webglProgram );\n\n\t}\n\n\tfunction update( uniformsGroup, program ) {\n\n\t\tlet buffer = buffers[ uniformsGroup.id ];\n\n\t\tif ( buffer === undefined ) {\n\n\t\t\tprepareUniformsGroup( uniformsGroup );\n\n\t\t\tbuffer = createBuffer( uniformsGroup );\n\t\t\tbuffers[ uniformsGroup.id ] = buffer;\n\n\t\t\tuniformsGroup.addEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\t}\n\n\t\t// ensure to update the binding points/block indices mapping for this program\n\n\t\tconst webglProgram = program.program;\n\t\tstate.updateUBOMapping( uniformsGroup, webglProgram );\n\n\t\t// update UBO once per frame\n\n\t\tconst frame = info.render.frame;\n\n\t\tif ( updateList[ uniformsGroup.id ] !== frame ) {\n\n\t\t\tupdateBufferData( uniformsGroup );\n\n\t\t\tupdateList[ uniformsGroup.id ] = frame;\n\n\t\t}\n\n\t}\n\n\tfunction createBuffer( uniformsGroup ) {\n\n\t\t// the setup of an UBO is independent of a particular shader program but global\n\n\t\tconst bindingPointIndex = allocateBindingPointIndex();\n\t\tuniformsGroup.__bindingPointIndex = bindingPointIndex;\n\n\t\tconst buffer = gl.createBuffer();\n\t\tconst size = uniformsGroup.__size;\n\t\tconst usage = uniformsGroup.usage;\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, buffer );\n\t\tgl.bufferData( gl.UNIFORM_BUFFER, size, usage );\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, null );\n\t\tgl.bindBufferBase( gl.UNIFORM_BUFFER, bindingPointIndex, buffer );\n\n\t\treturn buffer;\n\n\t}\n\n\tfunction allocateBindingPointIndex() {\n\n\t\tfor ( let i = 0; i < maxBindingPoints; i ++ ) {\n\n\t\t\tif ( allocatedBindingPoints.indexOf( i ) === - 1 ) {\n\n\t\t\t\tallocatedBindingPoints.push( i );\n\t\t\t\treturn i;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconsole.error( 'THREE.WebGLRenderer: Maximum number of simultaneously usable uniforms groups reached.' );\n\n\t\treturn 0;\n\n\t}\n\n\tfunction updateBufferData( uniformsGroup ) {\n\n\t\tconst buffer = buffers[ uniformsGroup.id ];\n\t\tconst uniforms = uniformsGroup.uniforms;\n\t\tconst cache = uniformsGroup.__cache;\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, buffer );\n\n\t\tfor ( let i = 0, il = uniforms.length; i < il; i ++ ) {\n\n\t\t\tconst uniform = uniforms[ i ];\n\n\t\t\t// partly update the buffer if necessary\n\n\t\t\tif ( hasUniformChanged( uniform, i, cache ) === true ) {\n\n\t\t\t\tconst offset = uniform.__offset;\n\n\t\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\t\tlet arrayOffset = 0;\n\n\t\t\t\tfor ( let i = 0; i < values.length; i ++ ) {\n\n\t\t\t\t\tconst value = values[ i ];\n\n\t\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\t\tif ( typeof value === 'number' ) {\n\n\t\t\t\t\t\tuniform.__data[ 0 ] = value;\n\t\t\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, offset + arrayOffset, uniform.__data );\n\n\t\t\t\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t\t\t\t// manually converting 3x3 to 3x4\n\n\t\t\t\t\t\tuniform.__data[ 0 ] = value.elements[ 0 ];\n\t\t\t\t\t\tuniform.__data[ 1 ] = value.elements[ 1 ];\n\t\t\t\t\t\tuniform.__data[ 2 ] = value.elements[ 2 ];\n\t\t\t\t\t\tuniform.__data[ 3 ] = value.elements[ 0 ];\n\t\t\t\t\t\tuniform.__data[ 4 ] = value.elements[ 3 ];\n\t\t\t\t\t\tuniform.__data[ 5 ] = value.elements[ 4 ];\n\t\t\t\t\t\tuniform.__data[ 6 ] = value.elements[ 5 ];\n\t\t\t\t\t\tuniform.__data[ 7 ] = value.elements[ 0 ];\n\t\t\t\t\t\tuniform.__data[ 8 ] = value.elements[ 6 ];\n\t\t\t\t\t\tuniform.__data[ 9 ] = value.elements[ 7 ];\n\t\t\t\t\t\tuniform.__data[ 10 ] = value.elements[ 8 ];\n\t\t\t\t\t\tuniform.__data[ 11 ] = value.elements[ 0 ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvalue.toArray( uniform.__data, arrayOffset );\n\n\t\t\t\t\t\tarrayOffset += info.storage / Float32Array.BYTES_PER_ELEMENT;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, offset, uniform.__data );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, null );\n\n\t}\n\n\tfunction hasUniformChanged( uniform, index, cache ) {\n\n\t\tconst value = uniform.value;\n\n\t\tif ( cache[ index ] === undefined ) {\n\n\t\t\t// cache entry does not exist so far\n\n\t\t\tif ( typeof value === 'number' ) {\n\n\t\t\t\tcache[ index ] = value;\n\n\t\t\t} else {\n\n\t\t\t\tconst values = Array.isArray( value ) ? value : [ value ];\n\n\t\t\t\tconst tempValues = [];\n\n\t\t\t\tfor ( let i = 0; i < values.length; i ++ ) {\n\n\t\t\t\t\ttempValues.push( values[ i ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tcache[ index ] = tempValues;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t} else {\n\n\t\t\t// compare current value with cached entry\n\n\t\t\tif ( typeof value === 'number' ) {\n\n\t\t\t\tif ( cache[ index ] !== value ) {\n\n\t\t\t\t\tcache[ index ] = value;\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst cachedObjects = Array.isArray( cache[ index ] ) ? cache[ index ] : [ cache[ index ] ];\n\t\t\t\tconst values = Array.isArray( value ) ? value : [ value ];\n\n\t\t\t\tfor ( let i = 0; i < cachedObjects.length; i ++ ) {\n\n\t\t\t\t\tconst cachedObject = cachedObjects[ i ];\n\n\t\t\t\t\tif ( cachedObject.equals( values[ i ] ) === false ) {\n\n\t\t\t\t\t\tcachedObject.copy( values[ i ] );\n\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction prepareUniformsGroup( uniformsGroup ) {\n\n\t\t// determine total buffer size according to the STD140 layout\n\t\t// Hint: STD140 is the only supported layout in WebGL 2\n\n\t\tconst uniforms = uniformsGroup.uniforms;\n\n\t\tlet offset = 0; // global buffer offset in bytes\n\t\tconst chunkSize = 16; // size of a chunk in bytes\n\t\tlet chunkOffset = 0; // offset within a single chunk in bytes\n\n\t\tfor ( let i = 0, l = uniforms.length; i < l; i ++ ) {\n\n\t\t\tconst uniform = uniforms[ i ];\n\n\t\t\tconst infos = {\n\t\t\t\tboundary: 0, // bytes\n\t\t\t\tstorage: 0 // bytes\n\t\t\t};\n\n\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\tfor ( let j = 0, jl = values.length; j < jl; j ++ ) {\n\n\t\t\t\tconst value = values[ j ];\n\n\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\tinfos.boundary += info.boundary;\n\t\t\t\tinfos.storage += info.storage;\n\n\t\t\t}\n\n\t\t\t// the following two properties will be used for partial buffer updates\n\n\t\t\tuniform.__data = new Float32Array( infos.storage / Float32Array.BYTES_PER_ELEMENT );\n\t\t\tuniform.__offset = offset;\n\n\t\t\t//\n\n\t\t\tif ( i > 0 ) {\n\n\t\t\t\tchunkOffset = offset % chunkSize;\n\n\t\t\t\tconst remainingSizeInChunk = chunkSize - chunkOffset;\n\n\t\t\t\t// check for chunk overflow\n\n\t\t\t\tif ( chunkOffset !== 0 && ( remainingSizeInChunk - infos.boundary ) < 0 ) {\n\n\t\t\t\t\t// add padding and adjust offset\n\n\t\t\t\t\toffset += ( chunkSize - chunkOffset );\n\t\t\t\t\tuniform.__offset = offset;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\toffset += infos.storage;\n\n\t\t}\n\n\t\t// ensure correct final padding\n\n\t\tchunkOffset = offset % chunkSize;\n\n\t\tif ( chunkOffset > 0 ) offset += ( chunkSize - chunkOffset );\n\n\t\t//\n\n\t\tuniformsGroup.__size = offset;\n\t\tuniformsGroup.__cache = {};\n\n\t\treturn this;\n\n\t}\n\n\tfunction getUniformSize( value ) {\n\n\t\tconst info = {\n\t\t\tboundary: 0, // bytes\n\t\t\tstorage: 0 // bytes\n\t\t};\n\n\t\t// determine sizes according to STD140\n\n\t\tif ( typeof value === 'number' ) {\n\n\t\t\t// float/int\n\n\t\t\tinfo.boundary = 4;\n\t\t\tinfo.storage = 4;\n\n\t\t} else if ( value.isVector2 ) {\n\n\t\t\t// vec2\n\n\t\t\tinfo.boundary = 8;\n\t\t\tinfo.storage = 8;\n\n\t\t} else if ( value.isVector3 || value.isColor ) {\n\n\t\t\t// vec3\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 12; // evil: vec3 must start on a 16-byte boundary but it only consumes 12 bytes\n\n\t\t} else if ( value.isVector4 ) {\n\n\t\t\t// vec4\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 16;\n\n\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t// mat3 (in STD140 a 3x3 matrix is represented as 3x4)\n\n\t\t\tinfo.boundary = 48;\n\t\t\tinfo.storage = 48;\n\n\t\t} else if ( value.isMatrix4 ) {\n\n\t\t\t// mat4\n\n\t\t\tinfo.boundary = 64;\n\t\t\tinfo.storage = 64;\n\n\t\t} else if ( value.isTexture ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group.' );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Unsupported uniform value type.', value );\n\n\t\t}\n\n\t\treturn info;\n\n\t}\n\n\tfunction onUniformsGroupsDispose( event ) {\n\n\t\tconst uniformsGroup = event.target;\n\n\t\tuniformsGroup.removeEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\tconst index = allocatedBindingPoints.indexOf( uniformsGroup.__bindingPointIndex );\n\t\tallocatedBindingPoints.splice( index, 1 );\n\n\t\tgl.deleteBuffer( buffers[ uniformsGroup.id ] );\n\n\t\tdelete buffers[ uniformsGroup.id ];\n\t\tdelete updateList[ uniformsGroup.id ];\n\n\t}\n\n\tfunction dispose() {\n\n\t\tfor ( const id in buffers ) {\n\n\t\t\tgl.deleteBuffer( buffers[ id ] );\n\n\t\t}\n\n\t\tallocatedBindingPoints = [];\n\t\tbuffers = {};\n\t\tupdateList = {};\n\n\t}\n\n\treturn {\n\n\t\tbind: bind,\n\t\tupdate: update,\n\n\t\tdispose: dispose\n\n\t};\n\n}\n\nclass WebGLRenderer {\n\n\tconstructor( parameters = {} ) {\n\n\t\tconst {\n\t\t\tcanvas = createCanvasElement(),\n\t\t\tcontext = null,\n\t\t\tdepth = true,\n\t\t\tstencil = true,\n\t\t\talpha = false,\n\t\t\tantialias = false,\n\t\t\tpremultipliedAlpha = true,\n\t\t\tpreserveDrawingBuffer = false,\n\t\t\tpowerPreference = 'default',\n\t\t\tfailIfMajorPerformanceCaveat = false,\n\t\t} = parameters;\n\n\t\tthis.isWebGLRenderer = true;\n\n\t\tlet _alpha;\n\n\t\tif ( context !== null ) {\n\n\t\t\t_alpha = context.getContextAttributes().alpha;\n\n\t\t} else {\n\n\t\t\t_alpha = alpha;\n\n\t\t}\n\n\t\tconst uintClearColor = new Uint32Array( 4 );\n\t\tconst intClearColor = new Int32Array( 4 );\n\n\t\tlet currentRenderList = null;\n\t\tlet currentRenderState = null;\n\n\t\t// render() can be called from within a callback triggered by another render.\n\t\t// We track this so that the nested render call gets its list and state isolated from the parent render call.\n\n\t\tconst renderListStack = [];\n\t\tconst renderStateStack = [];\n\n\t\t// public properties\n\n\t\tthis.domElement = canvas;\n\n\t\t// Debug configuration container\n\t\tthis.debug = {\n\n\t\t\t/**\n\t\t\t * Enables error checking and reporting when shader programs are being compiled\n\t\t\t * @type {boolean}\n\t\t\t */\n\t\t\tcheckShaderErrors: true,\n\t\t\t/**\n\t\t\t * Callback for custom error reporting.\n\t\t\t * @type {?Function}\n\t\t\t */\n\t\t\tonShaderError: null\n\t\t};\n\n\t\t// clearing\n\n\t\tthis.autoClear = true;\n\t\tthis.autoClearColor = true;\n\t\tthis.autoClearDepth = true;\n\t\tthis.autoClearStencil = true;\n\n\t\t// scene graph\n\n\t\tthis.sortObjects = true;\n\n\t\t// user-defined clipping\n\n\t\tthis.clippingPlanes = [];\n\t\tthis.localClippingEnabled = false;\n\n\t\t// physically based shading\n\n\t\tthis._outputColorSpace = SRGBColorSpace;\n\n\t\t// physical lights\n\n\t\tthis._useLegacyLights = false;\n\n\t\t// tone mapping\n\n\t\tthis.toneMapping = NoToneMapping;\n\t\tthis.toneMappingExposure = 1.0;\n\n\t\t// internal properties\n\n\t\tconst _this = this;\n\n\t\tlet _isContextLost = false;\n\n\t\t// internal state cache\n\n\t\tlet _currentActiveCubeFace = 0;\n\t\tlet _currentActiveMipmapLevel = 0;\n\t\tlet _currentRenderTarget = null;\n\t\tlet _currentMaterialId = - 1;\n\n\t\tlet _currentCamera = null;\n\n\t\tconst _currentViewport = new Vector4();\n\t\tconst _currentScissor = new Vector4();\n\t\tlet _currentScissorTest = null;\n\n\t\tconst _currentClearColor = new Color( 0x000000 );\n\t\tlet _currentClearAlpha = 0;\n\n\t\t//\n\n\t\tlet _width = canvas.width;\n\t\tlet _height = canvas.height;\n\n\t\tlet _pixelRatio = 1;\n\t\tlet _opaqueSort = null;\n\t\tlet _transparentSort = null;\n\n\t\tconst _viewport = new Vector4( 0, 0, _width, _height );\n\t\tconst _scissor = new Vector4( 0, 0, _width, _height );\n\t\tlet _scissorTest = false;\n\n\t\t// frustum\n\n\t\tconst _frustum = new Frustum();\n\n\t\t// clipping\n\n\t\tlet _clippingEnabled = false;\n\t\tlet _localClippingEnabled = false;\n\n\t\t// transmission\n\n\t\tlet _transmissionRenderTarget = null;\n\n\t\t// camera matrices cache\n\n\t\tconst _projScreenMatrix = new Matrix4();\n\n\t\tconst _vector2 = new Vector2();\n\t\tconst _vector3 = new Vector3();\n\n\t\tconst _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\t// initialize\n\n\t\tlet _gl = context;\n\n\t\tfunction getContext( contextNames, contextAttributes ) {\n\n\t\t\tfor ( let i = 0; i < contextNames.length; i ++ ) {\n\n\t\t\t\tconst contextName = contextNames[ i ];\n\t\t\t\tconst context = canvas.getContext( contextName, contextAttributes );\n\t\t\t\tif ( context !== null ) return context;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\ttry {\n\n\t\t\tconst contextAttributes = {\n\t\t\t\talpha: true,\n\t\t\t\tdepth,\n\t\t\t\tstencil,\n\t\t\t\tantialias,\n\t\t\t\tpremultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer,\n\t\t\t\tpowerPreference,\n\t\t\t\tfailIfMajorPerformanceCaveat,\n\t\t\t};\n\n\t\t\t// OffscreenCanvas does not have setAttribute, see #22811\n\t\t\tif ( 'setAttribute' in canvas ) canvas.setAttribute( 'data-engine', `three.js r${REVISION}` );\n\n\t\t\t// event listeners must be registered before WebGL context is created, see #12753\n\t\t\tcanvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\tcanvas.addEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t\tcanvas.addEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tconst contextNames = [ 'webgl2', 'webgl', 'experimental-webgl' ];\n\n\t\t\t\tif ( _this.isWebGL1Renderer === true ) {\n\n\t\t\t\t\tcontextNames.shift();\n\n\t\t\t\t}\n\n\t\t\t\t_gl = getContext( contextNames, contextAttributes );\n\n\t\t\t\tif ( _gl === null ) {\n\n\t\t\t\t\tif ( getContext( contextNames ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'Error creating WebGL context with your selected attributes.' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( 'Error creating WebGL context.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( typeof WebGLRenderingContext !== 'undefined' && _gl instanceof WebGLRenderingContext ) { // @deprecated, r153\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: WebGL 1 support was deprecated in r153 and will be removed in r163.' );\n\n\t\t\t}\n\n\t\t\t// Some experimental-webgl implementations do not have getShaderPrecisionFormat\n\n\t\t\tif ( _gl.getShaderPrecisionFormat === undefined ) {\n\n\t\t\t\t_gl.getShaderPrecisionFormat = function () {\n\n\t\t\t\t\treturn { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: ' + error.message );\n\t\t\tthrow error;\n\n\t\t}\n\n\t\tlet extensions, capabilities, state, info;\n\t\tlet properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects;\n\t\tlet programCache, materials, renderLists, renderStates, clipping, shadowMap;\n\n\t\tlet background, morphtargets, bufferRenderer, indexedBufferRenderer;\n\n\t\tlet utils, bindingStates, uniformsGroups;\n\n\t\tfunction initGLContext() {\n\n\t\t\textensions = new WebGLExtensions( _gl );\n\n\t\t\tcapabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\t\textensions.init( capabilities );\n\n\t\t\tutils = new WebGLUtils( _gl, extensions, capabilities );\n\n\t\t\tstate = new WebGLState( _gl, extensions, capabilities );\n\n\t\t\tinfo = new WebGLInfo( _gl );\n\t\t\tproperties = new WebGLProperties();\n\t\t\ttextures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );\n\t\t\tcubemaps = new WebGLCubeMaps( _this );\n\t\t\tcubeuvmaps = new WebGLCubeUVMaps( _this );\n\t\t\tattributes = new WebGLAttributes( _gl, capabilities );\n\t\t\tbindingStates = new WebGLBindingStates( _gl, extensions, attributes, capabilities );\n\t\t\tgeometries = new WebGLGeometries( _gl, attributes, info, bindingStates );\n\t\t\tobjects = new WebGLObjects( _gl, geometries, attributes, info );\n\t\t\tmorphtargets = new WebGLMorphtargets( _gl, capabilities, textures );\n\t\t\tclipping = new WebGLClipping( properties );\n\t\t\tprogramCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping );\n\t\t\tmaterials = new WebGLMaterials( _this, properties );\n\t\t\trenderLists = new WebGLRenderLists();\n\t\t\trenderStates = new WebGLRenderStates( extensions, capabilities );\n\t\t\tbackground = new WebGLBackground( _this, cubemaps, cubeuvmaps, state, objects, _alpha, premultipliedAlpha );\n\t\t\tshadowMap = new WebGLShadowMap( _this, objects, capabilities );\n\t\t\tuniformsGroups = new WebGLUniformsGroups( _gl, info, capabilities, state );\n\n\t\t\tbufferRenderer = new WebGLBufferRenderer( _gl, extensions, info, capabilities );\n\t\t\tindexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info, capabilities );\n\n\t\t\tinfo.programs = programCache.programs;\n\n\t\t\t_this.capabilities = capabilities;\n\t\t\t_this.extensions = extensions;\n\t\t\t_this.properties = properties;\n\t\t\t_this.renderLists = renderLists;\n\t\t\t_this.shadowMap = shadowMap;\n\t\t\t_this.state = state;\n\t\t\t_this.info = info;\n\n\t\t}\n\n\t\tinitGLContext();\n\n\t\t// xr\n\n\t\tconst xr = new WebXRManager( _this, _gl );\n\n\t\tthis.xr = xr;\n\n\t\t// API\n\n\t\tthis.getContext = function () {\n\n\t\t\treturn _gl;\n\n\t\t};\n\n\t\tthis.getContextAttributes = function () {\n\n\t\t\treturn _gl.getContextAttributes();\n\n\t\t};\n\n\t\tthis.forceContextLoss = function () {\n\n\t\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.loseContext();\n\n\t\t};\n\n\t\tthis.forceContextRestore = function () {\n\n\t\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.restoreContext();\n\n\t\t};\n\n\t\tthis.getPixelRatio = function () {\n\n\t\t\treturn _pixelRatio;\n\n\t\t};\n\n\t\tthis.setPixelRatio = function ( value ) {\n\n\t\t\tif ( value === undefined ) return;\n\n\t\t\t_pixelRatio = value;\n\n\t\t\tthis.setSize( _width, _height, false );\n\n\t\t};\n\n\t\tthis.getSize = function ( target ) {\n\n\t\t\treturn target.set( _width, _height );\n\n\t\t};\n\n\t\tthis.setSize = function ( width, height, updateStyle = true ) {\n\n\t\t\tif ( xr.isPresenting ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Can\\'t change size while VR device is presenting.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\tcanvas.width = Math.floor( width * _pixelRatio );\n\t\t\tcanvas.height = Math.floor( height * _pixelRatio );\n\n\t\t\tif ( updateStyle === true ) {\n\n\t\t\t\tcanvas.style.width = width + 'px';\n\t\t\t\tcanvas.style.height = height + 'px';\n\n\t\t\t}\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\tthis.getDrawingBufferSize = function ( target ) {\n\n\t\t\treturn target.set( _width * _pixelRatio, _height * _pixelRatio ).floor();\n\n\t\t};\n\n\t\tthis.setDrawingBufferSize = function ( width, height, pixelRatio ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_pixelRatio = pixelRatio;\n\n\t\t\tcanvas.width = Math.floor( width * pixelRatio );\n\t\t\tcanvas.height = Math.floor( height * pixelRatio );\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\tthis.getCurrentViewport = function ( target ) {\n\n\t\t\treturn target.copy( _currentViewport );\n\n\t\t};\n\n\t\tthis.getViewport = function ( target ) {\n\n\t\t\treturn target.copy( _viewport );\n\n\t\t};\n\n\t\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\t_viewport.set( x.x, x.y, x.z, x.w );\n\n\t\t\t} else {\n\n\t\t\t\t_viewport.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor() );\n\n\t\t};\n\n\t\tthis.getScissor = function ( target ) {\n\n\t\t\treturn target.copy( _scissor );\n\n\t\t};\n\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\t_scissor.set( x.x, x.y, x.z, x.w );\n\n\t\t\t} else {\n\n\t\t\t\t_scissor.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor() );\n\n\t\t};\n\n\t\tthis.getScissorTest = function () {\n\n\t\t\treturn _scissorTest;\n\n\t\t};\n\n\t\tthis.setScissorTest = function ( boolean ) {\n\n\t\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t\t};\n\n\t\tthis.setOpaqueSort = function ( method ) {\n\n\t\t\t_opaqueSort = method;\n\n\t\t};\n\n\t\tthis.setTransparentSort = function ( method ) {\n\n\t\t\t_transparentSort = method;\n\n\t\t};\n\n\t\t// Clearing\n\n\t\tthis.getClearColor = function ( target ) {\n\n\t\t\treturn target.copy( background.getClearColor() );\n\n\t\t};\n\n\t\tthis.setClearColor = function () {\n\n\t\t\tbackground.setClearColor.apply( background, arguments );\n\n\t\t};\n\n\t\tthis.getClearAlpha = function () {\n\n\t\t\treturn background.getClearAlpha();\n\n\t\t};\n\n\t\tthis.setClearAlpha = function () {\n\n\t\t\tbackground.setClearAlpha.apply( background, arguments );\n\n\t\t};\n\n\t\tthis.clear = function ( color = true, depth = true, stencil = true ) {\n\n\t\t\tlet bits = 0;\n\n\t\t\tif ( color ) {\n\n\t\t\t\t// check if we're trying to clear an integer target\n\t\t\t\tlet isIntegerFormat = false;\n\t\t\t\tif ( _currentRenderTarget !== null ) {\n\n\t\t\t\t\tconst targetFormat = _currentRenderTarget.texture.format;\n\t\t\t\t\tisIntegerFormat = targetFormat === RGBAIntegerFormat ||\n\t\t\t\t\t\ttargetFormat === RGIntegerFormat ||\n\t\t\t\t\t\ttargetFormat === RedIntegerFormat;\n\n\t\t\t\t}\n\n\t\t\t\t// use the appropriate clear functions to clear the target if it's a signed\n\t\t\t\t// or unsigned integer target\n\t\t\t\tif ( isIntegerFormat ) {\n\n\t\t\t\t\tconst targetType = _currentRenderTarget.texture.type;\n\t\t\t\t\tconst isUnsignedType = targetType === UnsignedByteType ||\n\t\t\t\t\t\ttargetType === UnsignedIntType ||\n\t\t\t\t\t\ttargetType === UnsignedShortType ||\n\t\t\t\t\t\ttargetType === UnsignedInt248Type ||\n\t\t\t\t\t\ttargetType === UnsignedShort4444Type ||\n\t\t\t\t\t\ttargetType === UnsignedShort5551Type;\n\n\t\t\t\t\tconst clearColor = background.getClearColor();\n\t\t\t\t\tconst a = background.getClearAlpha();\n\t\t\t\t\tconst r = clearColor.r;\n\t\t\t\t\tconst g = clearColor.g;\n\t\t\t\t\tconst b = clearColor.b;\n\n\t\t\t\t\tif ( isUnsignedType ) {\n\n\t\t\t\t\t\tuintClearColor[ 0 ] = r;\n\t\t\t\t\t\tuintClearColor[ 1 ] = g;\n\t\t\t\t\t\tuintClearColor[ 2 ] = b;\n\t\t\t\t\t\tuintClearColor[ 3 ] = a;\n\t\t\t\t\t\t_gl.clearBufferuiv( _gl.COLOR, 0, uintClearColor );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tintClearColor[ 0 ] = r;\n\t\t\t\t\t\tintClearColor[ 1 ] = g;\n\t\t\t\t\t\tintClearColor[ 2 ] = b;\n\t\t\t\t\t\tintClearColor[ 3 ] = a;\n\t\t\t\t\t\t_gl.clearBufferiv( _gl.COLOR, 0, intClearColor );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbits |= _gl.COLOR_BUFFER_BIT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( depth ) bits |= _gl.DEPTH_BUFFER_BIT;\n\t\t\tif ( stencil ) {\n\n\t\t\t\tbits |= _gl.STENCIL_BUFFER_BIT;\n\t\t\t\tthis.state.buffers.stencil.setMask( 0xffffffff );\n\n\t\t\t}\n\n\t\t\t_gl.clear( bits );\n\n\t\t};\n\n\t\tthis.clearColor = function () {\n\n\t\t\tthis.clear( true, false, false );\n\n\t\t};\n\n\t\tthis.clearDepth = function () {\n\n\t\t\tthis.clear( false, true, false );\n\n\t\t};\n\n\t\tthis.clearStencil = function () {\n\n\t\t\tthis.clear( false, false, true );\n\n\t\t};\n\n\t\t//\n\n\t\tthis.dispose = function () {\n\n\t\t\tcanvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\tcanvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t\tcanvas.removeEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\t\trenderLists.dispose();\n\t\t\trenderStates.dispose();\n\t\t\tproperties.dispose();\n\t\t\tcubemaps.dispose();\n\t\t\tcubeuvmaps.dispose();\n\t\t\tobjects.dispose();\n\t\t\tbindingStates.dispose();\n\t\t\tuniformsGroups.dispose();\n\t\t\tprogramCache.dispose();\n\n\t\t\txr.dispose();\n\n\t\t\txr.removeEventListener( 'sessionstart', onXRSessionStart );\n\t\t\txr.removeEventListener( 'sessionend', onXRSessionEnd );\n\n\t\t\tif ( _transmissionRenderTarget ) {\n\n\t\t\t\t_transmissionRenderTarget.dispose();\n\t\t\t\t_transmissionRenderTarget = null;\n\n\t\t\t}\n\n\t\t\tanimation.stop();\n\n\t\t};\n\n\t\t// Events\n\n\t\tfunction onContextLost( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tconsole.log( 'THREE.WebGLRenderer: Context Lost.' );\n\n\t\t\t_isContextLost = true;\n\n\t\t}\n\n\t\tfunction onContextRestore( /* event */ ) {\n\n\t\t\tconsole.log( 'THREE.WebGLRenderer: Context Restored.' );\n\n\t\t\t_isContextLost = false;\n\n\t\t\tconst infoAutoReset = info.autoReset;\n\t\t\tconst shadowMapEnabled = shadowMap.enabled;\n\t\t\tconst shadowMapAutoUpdate = shadowMap.autoUpdate;\n\t\t\tconst shadowMapNeedsUpdate = shadowMap.needsUpdate;\n\t\t\tconst shadowMapType = shadowMap.type;\n\n\t\t\tinitGLContext();\n\n\t\t\tinfo.autoReset = infoAutoReset;\n\t\t\tshadowMap.enabled = shadowMapEnabled;\n\t\t\tshadowMap.autoUpdate = shadowMapAutoUpdate;\n\t\t\tshadowMap.needsUpdate = shadowMapNeedsUpdate;\n\t\t\tshadowMap.type = shadowMapType;\n\n\t\t}\n\n\t\tfunction onContextCreationError( event ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: A WebGL context could not be created. Reason: ', event.statusMessage );\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tconst material = event.target;\n\n\t\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tdeallocateMaterial( material );\n\n\t\t}\n\n\t\t// Buffer deallocation\n\n\t\tfunction deallocateMaterial( material ) {\n\n\t\t\treleaseMaterialProgramReferences( material );\n\n\t\t\tproperties.remove( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReferences( material ) {\n\n\t\t\tconst programs = properties.get( material ).programs;\n\n\t\t\tif ( programs !== undefined ) {\n\n\t\t\t\tprograms.forEach( function ( program ) {\n\n\t\t\t\t\tprogramCache.releaseProgram( program );\n\n\t\t\t\t} );\n\n\t\t\t\tif ( material.isShaderMaterial ) {\n\n\t\t\t\t\tprogramCache.releaseShaderCache( material );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tthis.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) {\n\n\t\t\tif ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null)\n\n\t\t\tconst frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\t\tconst program = setProgram( camera, scene, geometry, material, object );\n\n\t\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\t\t//\n\n\t\t\tlet index = geometry.index;\n\t\t\tlet rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = geometries.getWireframeAttribute( geometry );\n\n\t\t\t\tif ( index === undefined ) return;\n\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst drawRange = geometry.drawRange;\n\t\t\tconst position = geometry.attributes.position;\n\n\t\t\tlet drawStart = drawRange.start * rangeFactor;\n\t\t\tlet drawEnd = ( drawRange.start + drawRange.count ) * rangeFactor;\n\n\t\t\tif ( group !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, group.start * rangeFactor );\n\t\t\t\tdrawEnd = Math.min( drawEnd, ( group.start + group.count ) * rangeFactor );\n\n\t\t\t}\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\t\tdrawEnd = Math.min( drawEnd, index.count );\n\n\t\t\t} else if ( position !== undefined && position !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\t\tdrawEnd = Math.min( drawEnd, position.count );\n\n\t\t\t}\n\n\t\t\tconst drawCount = drawEnd - drawStart;\n\n\t\t\tif ( drawCount < 0 || drawCount === Infinity ) return;\n\n\t\t\t//\n\n\t\t\tbindingStates.setup( object, material, program, geometry, index );\n\n\t\t\tlet attribute;\n\t\t\tlet renderer = bufferRenderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tattribute = attributes.get( index );\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( attribute );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tlet lineWidth = material.linewidth;\n\n\t\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_LOOP );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isPoints ) {\n\n\t\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t}\n\n\t\t\tif ( object.isInstancedMesh ) {\n\n\t\t\t\trenderer.renderInstances( drawStart, drawCount, object.count );\n\n\t\t\t} else if ( geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tconst maxInstanceCount = geometry._maxInstanceCount !== undefined ? geometry._maxInstanceCount : Infinity;\n\t\t\t\tconst instanceCount = Math.min( geometry.instanceCount, maxInstanceCount );\n\n\t\t\t\trenderer.renderInstances( drawStart, drawCount, instanceCount );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Compile\n\n\t\tfunction prepareMaterial( material, scene, object ) {\n\n\t\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = FrontSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t} else {\n\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.compile = function ( scene, camera, targetScene = null ) {\n\n\t\t\tif ( targetScene === null ) targetScene = scene;\n\n\t\t\tcurrentRenderState = renderStates.get( targetScene );\n\t\t\tcurrentRenderState.init();\n\n\t\t\trenderStateStack.push( currentRenderState );\n\n\t\t\t// gather lights from both the target scene and the new object that will be added to the scene.\n\n\t\t\ttargetScene.traverseVisible( function ( object ) {\n\n\t\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tif ( scene !== targetScene ) {\n\n\t\t\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\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\tcurrentRenderState.setupLights( _this._useLegacyLights );\n\n\t\t\t// Only initialize materials in the new scene, not the targetScene.\n\n\t\t\tconst materials = new Set();\n\n\t\t\tscene.traverse( function ( object ) {\n\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( material ) {\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tfor ( let i = 0; i < material.length; i ++ ) {\n\n\t\t\t\t\t\t\tconst material2 = material[ i ];\n\n\t\t\t\t\t\t\tprepareMaterial( material2, targetScene, object );\n\t\t\t\t\t\t\tmaterials.add( material2 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tprepareMaterial( material, targetScene, object );\n\t\t\t\t\t\tmaterials.add( material );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\trenderStateStack.pop();\n\t\t\tcurrentRenderState = null;\n\n\t\t\treturn materials;\n\n\t\t};\n\n\t\t// compileAsync\n\n\t\tthis.compileAsync = function ( scene, camera, targetScene = null ) {\n\n\t\t\tconst materials = this.compile( scene, camera, targetScene );\n\n\t\t\t// Wait for all the materials in the new object to indicate that they're\n\t\t\t// ready to be used before resolving the promise.\n\n\t\t\treturn new Promise( ( resolve ) => {\n\n\t\t\t\tfunction checkMaterialsReady() {\n\n\t\t\t\t\tmaterials.forEach( function ( material ) {\n\n\t\t\t\t\t\tconst materialProperties = properties.get( material );\n\t\t\t\t\t\tconst program = materialProperties.currentProgram;\n\n\t\t\t\t\t\tif ( program.isReady() ) {\n\n\t\t\t\t\t\t\t// remove any programs that report they're ready to use from the list\n\t\t\t\t\t\t\tmaterials.delete( material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\t// once the list of compiling materials is empty, call the callback\n\n\t\t\t\t\tif ( materials.size === 0 ) {\n\n\t\t\t\t\t\tresolve( scene );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// if some materials are still not ready, wait a bit and check again\n\n\t\t\t\t\tsetTimeout( checkMaterialsReady, 10 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extensions.get( 'KHR_parallel_shader_compile' ) !== null ) {\n\n\t\t\t\t\t// If we can check the compilation status of the materials without\n\t\t\t\t\t// blocking then do so right away.\n\n\t\t\t\t\tcheckMaterialsReady();\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise start by waiting a bit to give the materials we just\n\t\t\t\t\t// initialized a chance to finish.\n\n\t\t\t\t\tsetTimeout( checkMaterialsReady, 10 );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time ) {\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time );\n\n\t\t}\n\n\t\tfunction onXRSessionStart() {\n\n\t\t\tanimation.stop();\n\n\t\t}\n\n\t\tfunction onXRSessionEnd() {\n\n\t\t\tanimation.start();\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tif ( typeof self !== 'undefined' ) animation.setContext( self );\n\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\t\t\txr.setAnimationLoop( callback );\n\n\t\t\t( callback === null ) ? animation.stop() : animation.start();\n\n\t\t};\n\n\t\txr.addEventListener( 'sessionstart', onXRSessionStart );\n\t\txr.addEventListener( 'sessionend', onXRSessionEnd );\n\n\t\t// Rendering\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( _isContextLost === true ) return;\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\t\tif ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );\n\n\t\t\t\tcamera = xr.getCamera(); // use XR camera for rendering\n\n\t\t\t}\n\n\t\t\t//\n\t\t\tif ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget );\n\n\t\t\tcurrentRenderState = renderStates.get( scene, renderStateStack.length );\n\t\t\tcurrentRenderState.init();\n\n\t\t\trenderStateStack.push( currentRenderState );\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromProjectionMatrix( _projScreenMatrix );\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled );\n\n\t\t\tcurrentRenderList = renderLists.get( scene, renderListStack.length );\n\t\t\tcurrentRenderList.init();\n\n\t\t\trenderListStack.push( currentRenderList );\n\n\t\t\tprojectObject( scene, camera, 0, _this.sortObjects );\n\n\t\t\tcurrentRenderList.finish();\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\tcurrentRenderList.sort( _opaqueSort, _transparentSort );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tthis.info.render.frame ++;\n\n\t\t\tif ( _clippingEnabled === true ) clipping.beginShadows();\n\n\t\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\t\tshadowMap.render( shadowsArray, scene, camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.endShadows();\n\n\t\t\t//\n\n\t\t\tif ( this.info.autoReset === true ) this.info.reset();\n\n\n\t\t\t//\n\n\t\t\tbackground.render( currentRenderList, scene );\n\n\t\t\t// render scene\n\n\t\t\tcurrentRenderState.setupLights( _this._useLegacyLights );\n\n\t\t\tif ( camera.isArrayCamera ) {\n\n\t\t\t\tconst cameras = camera.cameras;\n\n\t\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\t\trenderScene( currentRenderList, scene, camera2, camera2.viewport );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderScene( currentRenderList, scene, camera );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( _currentRenderTarget !== null ) {\n\n\t\t\t\t// resolve multisample renderbuffers to a single-sample texture if necessary\n\n\t\t\t\ttextures.updateMultisampleRenderTarget( _currentRenderTarget );\n\n\t\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\t\ttextures.updateRenderTargetMipmap( _currentRenderTarget );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );\n\n\t\t\t// _gl.finish();\n\n\t\t\tbindingStates.resetDefaultState();\n\t\t\t_currentMaterialId = - 1;\n\t\t\t_currentCamera = null;\n\n\t\t\trenderStateStack.pop();\n\n\t\t\tif ( renderStateStack.length > 0 ) {\n\n\t\t\t\tcurrentRenderState = renderStateStack[ renderStateStack.length - 1 ];\n\n\t\t\t} else {\n\n\t\t\t\tcurrentRenderState = null;\n\n\t\t\t}\n\n\t\t\trenderListStack.pop();\n\n\t\t\tif ( renderListStack.length > 0 ) {\n\n\t\t\t\tcurrentRenderList = renderListStack[ renderListStack.length - 1 ];\n\n\t\t\t} else {\n\n\t\t\t\tcurrentRenderList = null;\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction projectObject( object, camera, groupOrder, sortObjects ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tconst visible = object.layers.test( camera.layers );\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isGroup ) {\n\n\t\t\t\t\tgroupOrder = object.renderOrder;\n\n\t\t\t\t} else if ( object.isLOD ) {\n\n\t\t\t\t\tif ( object.autoUpdate === true ) object.update( camera );\n\n\t\t\t\t} else if ( object.isLight ) {\n\n\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {\n\n\t\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\t\tif ( material.visible ) {\n\n\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {\n\n\t\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t\tif ( object.boundingSphere !== undefined ) {\n\n\t\t\t\t\t\t\t\tif ( object.boundingSphere === null ) object.computeBoundingSphere();\n\t\t\t\t\t\t\t\t_vector3.copy( object.boundingSphere.center );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\t\t\t\t\t\t\t\t_vector3.copy( geometry.boundingSphere.center );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_vector3\n\t\t\t\t\t\t\t\t.applyMatrix4( object.matrixWorld )\n\t\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector3.z, group );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );\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\tconst children = object.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, groupOrder, sortObjects );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderScene( currentRenderList, scene, camera, viewport ) {\n\n\t\t\tconst opaqueObjects = currentRenderList.opaque;\n\t\t\tconst transmissiveObjects = currentRenderList.transmissive;\n\t\t\tconst transparentObjects = currentRenderList.transparent;\n\n\t\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );\n\n\t\t\tif ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera );\n\n\t\t\tif ( viewport ) state.viewport( _currentViewport.copy( viewport ) );\n\n\t\t\tif ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );\n\t\t\tif ( transmissiveObjects.length > 0 ) renderObjects( transmissiveObjects, scene, camera );\n\t\t\tif ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera );\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.buffers.depth.setTest( true );\n\t\t\tstate.buffers.depth.setMask( true );\n\t\t\tstate.buffers.color.setMask( true );\n\n\t\t\tstate.setPolygonOffset( false );\n\n\t\t}\n\n\t\tfunction renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ) {\n\n\t\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\t\tif ( overrideMaterial !== null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst isWebGL2 = capabilities.isWebGL2;\n\n\t\t\tif ( _transmissionRenderTarget === null ) {\n\n\t\t\t\t_transmissionRenderTarget = new WebGLRenderTarget( 1, 1, {\n\t\t\t\t\tgenerateMipmaps: true,\n\t\t\t\t\ttype: extensions.has( 'EXT_color_buffer_half_float' ) ? HalfFloatType : UnsignedByteType,\n\t\t\t\t\tminFilter: LinearMipmapLinearFilter,\n\t\t\t\t\tsamples: ( isWebGL2 ) ? 4 : 0\n\t\t\t\t} );\n\n\t\t\t\t// debug\n\n\t\t\t\t/*\n\t\t\t\tconst geometry = new PlaneGeometry();\n\t\t\t\tconst material = new MeshBasicMaterial( { map: _transmissionRenderTarget.texture } );\n\n\t\t\t\tconst mesh = new Mesh( geometry, material );\n\t\t\t\tscene.add( mesh );\n\t\t\t\t*/\n\n\t\t\t}\n\n\t\t\t_this.getDrawingBufferSize( _vector2 );\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t_transmissionRenderTarget.setSize( _vector2.x, _vector2.y );\n\n\t\t\t} else {\n\n\t\t\t\t_transmissionRenderTarget.setSize( floorPowerOfTwo( _vector2.x ), floorPowerOfTwo( _vector2.y ) );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst currentRenderTarget = _this.getRenderTarget();\n\t\t\t_this.setRenderTarget( _transmissionRenderTarget );\n\n\t\t\t_this.getClearColor( _currentClearColor );\n\t\t\t_currentClearAlpha = _this.getClearAlpha();\n\t\t\tif ( _currentClearAlpha < 1 ) _this.setClearColor( 0xffffff, 0.5 );\n\n\t\t\t_this.clear();\n\n\t\t\t// Turn off the features which can affect the frag color for opaque objects pass.\n\t\t\t// Otherwise they are applied twice in opaque objects pass and transmission objects pass.\n\t\t\tconst currentToneMapping = _this.toneMapping;\n\t\t\t_this.toneMapping = NoToneMapping;\n\n\t\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t\ttextures.updateMultisampleRenderTarget( _transmissionRenderTarget );\n\t\t\ttextures.updateRenderTargetMipmap( _transmissionRenderTarget );\n\n\t\t\tlet renderTargetNeedsUpdate = false;\n\n\t\t\tfor ( let i = 0, l = transmissiveObjects.length; i < l; i ++ ) {\n\n\t\t\t\tconst renderItem = transmissiveObjects[ i ];\n\n\t\t\t\tconst object = renderItem.object;\n\t\t\t\tconst geometry = renderItem.geometry;\n\t\t\t\tconst material = renderItem.material;\n\t\t\t\tconst group = renderItem.group;\n\n\t\t\t\tif ( material.side === DoubleSide && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\tconst currentSide = material.side;\n\n\t\t\t\t\tmaterial.side = BackSide;\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t\t\tmaterial.side = currentSide;\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t\trenderTargetNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( renderTargetNeedsUpdate === true ) {\n\n\t\t\t\ttextures.updateMultisampleRenderTarget( _transmissionRenderTarget );\n\t\t\t\ttextures.updateRenderTargetMipmap( _transmissionRenderTarget );\n\n\t\t\t}\n\n\t\t\t_this.setRenderTarget( currentRenderTarget );\n\n\t\t\t_this.setClearColor( _currentClearColor, _currentClearAlpha );\n\n\t\t\t_this.toneMapping = currentToneMapping;\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera ) {\n\n\t\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\t\tfor ( let i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tconst renderItem = renderList[ i ];\n\n\t\t\t\tconst object = renderItem.object;\n\t\t\t\tconst geometry = renderItem.geometry;\n\t\t\t\tconst material = overrideMaterial === null ? renderItem.material : overrideMaterial;\n\t\t\t\tconst group = renderItem.group;\n\n\t\t\t\tif ( object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObject( object, scene, camera, geometry, material, group ) {\n\n\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\tmaterial.onBeforeRender( _this, scene, camera, geometry, object, group );\n\n\t\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t\tmaterial.side = FrontSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t} else {\n\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t}\n\n\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\t\t}\n\n\t\tfunction getProgram( material, scene, object ) {\n\n\t\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\t\tconst materialProperties = properties.get( material );\n\n\t\t\tconst lights = currentRenderState.state.lights;\n\t\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\t\tconst lightsStateVersion = lights.state.version;\n\n\t\t\tconst parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object );\n\t\t\tconst programCacheKey = programCache.getProgramCacheKey( parameters );\n\n\t\t\tlet programs = materialProperties.programs;\n\n\t\t\t// always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change\n\n\t\t\tmaterialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\t\tmaterialProperties.fog = scene.fog;\n\t\t\tmaterialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment );\n\n\t\t\tif ( programs === undefined ) {\n\n\t\t\t\t// new material\n\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t\tprograms = new Map();\n\t\t\t\tmaterialProperties.programs = programs;\n\n\t\t\t}\n\n\t\t\tlet program = programs.get( programCacheKey );\n\n\t\t\tif ( program !== undefined ) {\n\n\t\t\t\t// early out if program and light state is identical\n\n\t\t\t\tif ( materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion ) {\n\n\t\t\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t\t\treturn program;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tparameters.uniforms = programCache.getUniforms( material );\n\n\t\t\t\tmaterial.onBuild( object, parameters, _this );\n\n\t\t\t\tmaterial.onBeforeCompile( parameters, _this );\n\n\t\t\t\tprogram = programCache.acquireProgram( parameters, programCacheKey );\n\t\t\t\tprograms.set( programCacheKey, program );\n\n\t\t\t\tmaterialProperties.uniforms = parameters.uniforms;\n\n\t\t\t}\n\n\t\t\tconst uniforms = materialProperties.uniforms;\n\n\t\t\tif ( ( ! material.isShaderMaterial && ! material.isRawShaderMaterial ) || material.clipping === true ) {\n\n\t\t\t\tuniforms.clippingPlanes = clipping.uniform;\n\n\t\t\t}\n\n\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.needsLights = materialNeedsLights( material );\n\t\t\tmaterialProperties.lightsStateVersion = lightsStateVersion;\n\n\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\t\tuniforms.ambientLightColor.value = lights.state.ambient;\n\t\t\t\tuniforms.lightProbe.value = lights.state.probe;\n\t\t\t\tuniforms.directionalLights.value = lights.state.directional;\n\t\t\t\tuniforms.directionalLightShadows.value = lights.state.directionalShadow;\n\t\t\t\tuniforms.spotLights.value = lights.state.spot;\n\t\t\t\tuniforms.spotLightShadows.value = lights.state.spotShadow;\n\t\t\t\tuniforms.rectAreaLights.value = lights.state.rectArea;\n\t\t\t\tuniforms.ltc_1.value = lights.state.rectAreaLTC1;\n\t\t\t\tuniforms.ltc_2.value = lights.state.rectAreaLTC2;\n\t\t\t\tuniforms.pointLights.value = lights.state.point;\n\t\t\t\tuniforms.pointLightShadows.value = lights.state.pointShadow;\n\t\t\t\tuniforms.hemisphereLights.value = lights.state.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = lights.state.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = lights.state.spotShadowMap;\n\t\t\t\tuniforms.spotLightMatrix.value = lights.state.spotLightMatrix;\n\t\t\t\tuniforms.spotLightMap.value = lights.state.spotLightMap;\n\t\t\t\tuniforms.pointShadowMap.value = lights.state.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;\n\t\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t\t}\n\n\t\t\tmaterialProperties.currentProgram = program;\n\t\t\tmaterialProperties.uniformsList = null;\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction getUniformList( materialProperties ) {\n\n\t\t\tif ( materialProperties.uniformsList === null ) {\n\n\t\t\t\tconst progUniforms = materialProperties.currentProgram.getUniforms();\n\t\t\t\tmaterialProperties.uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, materialProperties.uniforms );\n\n\t\t\t}\n\n\t\t\treturn materialProperties.uniformsList;\n\n\t\t}\n\n\t\tfunction updateCommonMaterialProperties( material, parameters ) {\n\n\t\t\tconst materialProperties = properties.get( material );\n\n\t\t\tmaterialProperties.outputColorSpace = parameters.outputColorSpace;\n\t\t\tmaterialProperties.instancing = parameters.instancing;\n\t\t\tmaterialProperties.instancingColor = parameters.instancingColor;\n\t\t\tmaterialProperties.skinning = parameters.skinning;\n\t\t\tmaterialProperties.morphTargets = parameters.morphTargets;\n\t\t\tmaterialProperties.morphNormals = parameters.morphNormals;\n\t\t\tmaterialProperties.morphColors = parameters.morphColors;\n\t\t\tmaterialProperties.morphTargetsCount = parameters.morphTargetsCount;\n\t\t\tmaterialProperties.numClippingPlanes = parameters.numClippingPlanes;\n\t\t\tmaterialProperties.numIntersection = parameters.numClipIntersection;\n\t\t\tmaterialProperties.vertexAlphas = parameters.vertexAlphas;\n\t\t\tmaterialProperties.vertexTangents = parameters.vertexTangents;\n\t\t\tmaterialProperties.toneMapping = parameters.toneMapping;\n\n\t\t}\n\n\t\tfunction setProgram( camera, scene, geometry, material, object ) {\n\n\t\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\t\ttextures.resetTextureUnits();\n\n\t\t\tconst fog = scene.fog;\n\t\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\t\tconst colorSpace = ( _currentRenderTarget === null ) ? _this.outputColorSpace : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace );\n\t\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\t\tconst vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4;\n\t\t\tconst vertexTangents = !! geometry.attributes.tangent && ( !! material.normalMap || material.anisotropy > 0 );\n\t\t\tconst morphTargets = !! geometry.morphAttributes.position;\n\t\t\tconst morphNormals = !! geometry.morphAttributes.normal;\n\t\t\tconst morphColors = !! geometry.morphAttributes.color;\n\n\t\t\tlet toneMapping = NoToneMapping;\n\n\t\t\tif ( material.toneMapped ) {\n\n\t\t\t\tif ( _currentRenderTarget === null || _currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\t\t\t\ttoneMapping = _this.toneMapping;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\t\tconst materialProperties = properties.get( material );\n\t\t\tconst lights = currentRenderState.state.lights;\n\n\t\t\tif ( _clippingEnabled === true ) {\n\n\t\t\t\tif ( _localClippingEnabled === true || camera !== _currentCamera ) {\n\n\t\t\t\t\tconst useCache =\n\t\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t\t// (#8465, #8379)\n\t\t\t\t\tclipping.setState( material, camera, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet needsProgramChange = false;\n\n\t\t\tif ( material.version === materialProperties.__version ) {\n\n\t\t\t\tif ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.outputColorSpace !== colorSpace ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancing === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isInstancedMesh && materialProperties.instancing === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isSkinnedMesh && materialProperties.skinning === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isSkinnedMesh && materialProperties.skinning === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingColor === true && object.instanceColor === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingColor === false && object.instanceColor !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.envMap !== envMap ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( material.fog === true && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t\t( materialProperties.numClippingPlanes !== clipping.numPlanes ||\n\t\t\t\t\tmaterialProperties.numIntersection !== clipping.numIntersection ) ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.vertexAlphas !== vertexAlphas ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.vertexTangents !== vertexTangents ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphTargets !== morphTargets ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphNormals !== morphNormals ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphColors !== morphColors ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.toneMapping !== toneMapping ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( capabilities.isWebGL2 === true && materialProperties.morphTargetsCount !== morphTargetsCount ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tneedsProgramChange = true;\n\t\t\t\tmaterialProperties.__version = material.version;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet program = materialProperties.currentProgram;\n\n\t\t\tif ( needsProgramChange === true ) {\n\n\t\t\t\tprogram = getProgram( material, scene, object );\n\n\t\t\t}\n\n\t\t\tlet refreshProgram = false;\n\t\t\tlet refreshMaterial = false;\n\t\t\tlet refreshLights = false;\n\n\t\t\tconst p_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.uniforms;\n\n\t\t\tif ( state.useProgram( program.program ) ) {\n\n\t\t\t\trefreshProgram = true;\n\t\t\t\trefreshMaterial = true;\n\t\t\t\trefreshLights = true;\n\n\t\t\t}\n\n\t\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t\t_currentMaterialId = material.id;\n\n\t\t\t\trefreshMaterial = true;\n\n\t\t\t}\n\n\t\t\tif ( refreshProgram || _currentCamera !== camera ) {\n\n\t\t\t\t// common camera uniforms\n\n\t\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );\n\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\tconst uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\tuCamPos.setValue( _gl, _vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\t\t\t\t// consider moving isOrthographic to UniformLib and WebGLMaterials, see https://github.com/mrdoob/three.js/pull/26467#issuecomment-1645185067\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isShaderMaterial ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true );\n\n\t\t\t\t}\n\n\t\t\t\tif ( _currentCamera !== camera ) {\n\n\t\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// skinning and morph target uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone and morph texture must go before other textures\n\t\t\t// otherwise textures used for skinning and morphing can take over texture units reserved for other material textures\n\n\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\t\tconst skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tif ( capabilities.floatVertexTextures ) {\n\n\t\t\t\t\t\tif ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();\n\n\t\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );\n\t\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: SkinnedMesh can only be used with WebGL 2. With WebGL 1 OES_texture_float and vertex textures support is required.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\t\tif ( morphAttributes.position !== undefined || morphAttributes.normal !== undefined || ( morphAttributes.color !== undefined && capabilities.isWebGL2 === true ) ) {\n\n\t\t\t\tmorphtargets.update( object, geometry, program );\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) {\n\n\t\t\t\tmaterialProperties.receiveShadow = object.receiveShadow;\n\t\t\t\tp_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow );\n\n\t\t\t}\n\n\t\t\t// https://github.com/mrdoob/three.js/pull/24467#issuecomment-1209031512\n\n\t\t\tif ( material.isMeshGouraudMaterial && material.envMap !== null ) {\n\n\t\t\t\tm_uniforms.envMap.value = envMap;\n\n\t\t\t\tm_uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );\n\n\t\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t\t// values\n\t\t\t\t\t//\n\t\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t\t// the GL state when required\n\n\t\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh uniforms common to several materials\n\n\t\t\t\tif ( fog && material.fog === true ) {\n\n\t\t\t\t\tmaterials.refreshFogUniforms( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, _transmissionRenderTarget );\n\n\t\t\t\tWebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );\n\n\t\t\t}\n\n\t\t\tif ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {\n\n\t\t\t\tWebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );\n\t\t\t\tmaterial.uniformsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( material.isSpriteMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'center', object.center );\n\n\t\t\t}\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\t// UBOs\n\n\t\t\tif ( material.isShaderMaterial || material.isRawShaderMaterial ) {\n\n\t\t\t\tconst groups = material.uniformsGroups;\n\n\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\t\t\tuniformsGroups.update( group, program );\n\t\t\t\t\t\tuniformsGroups.bind( group, program );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Uniform Buffer Objects can only be used with WebGL 2.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\t\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\t\tuniforms.ambientLightColor.needsUpdate = value;\n\t\t\tuniforms.lightProbe.needsUpdate = value;\n\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.directionalLightShadows.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.pointLightShadows.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.spotLightShadows.needsUpdate = value;\n\t\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\tfunction materialNeedsLights( material ) {\n\n\t\t\treturn material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial || material.isShadowMaterial ||\n\t\t\t\t( material.isShaderMaterial && material.lights === true );\n\n\t\t}\n\n\t\tthis.getActiveCubeFace = function () {\n\n\t\t\treturn _currentActiveCubeFace;\n\n\t\t};\n\n\t\tthis.getActiveMipmapLevel = function () {\n\n\t\t\treturn _currentActiveMipmapLevel;\n\n\t\t};\n\n\t\tthis.getRenderTarget = function () {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTargetTextures = function ( renderTarget, colorTexture, depthTexture ) {\n\n\t\t\tproperties.get( renderTarget.texture ).__webglTexture = colorTexture;\n\t\t\tproperties.get( renderTarget.depthTexture ).__webglTexture = depthTexture;\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\trenderTargetProperties.__hasExternalTextures = true;\n\n\t\t\tif ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\t\trenderTargetProperties.__autoAllocateDepthBuffer = depthTexture === undefined;\n\n\t\t\t\tif ( ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\t\t\t// The multisample_render_to_texture extension doesn't work properly if there\n\t\t\t\t\t// are midframe flushes and an external depth buffer. Disable use of the extension.\n\t\t\t\t\tif ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided' );\n\t\t\t\t\t\trenderTargetProperties.__useRenderToTexture = 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.setRenderTargetFramebuffer = function ( renderTarget, defaultFramebuffer ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\trenderTargetProperties.__webglFramebuffer = defaultFramebuffer;\n\t\t\trenderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === undefined;\n\n\t\t};\n\n\t\tthis.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\t\t\t_currentActiveCubeFace = activeCubeFace;\n\t\t\t_currentActiveMipmapLevel = activeMipmapLevel;\n\n\t\t\tlet useDefaultFramebuffer = true;\n\t\t\tlet framebuffer = null;\n\t\t\tlet isCube = false;\n\t\t\tlet isRenderTarget3D = false;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tif ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) {\n\n\t\t\t\t\t// We need to make sure to rebind the framebuffer.\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\t\t\t\t\tuseDefaultFramebuffer = false;\n\n\t\t\t\t} else if ( renderTargetProperties.__webglFramebuffer === undefined ) {\n\n\t\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t\t} else if ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\t\t\t// Color and depth texture must be rebound in order for the swapchain to update.\n\t\t\t\t\ttextures.rebindTextures( renderTarget, properties.get( renderTarget.texture ).__webglTexture, properties.get( renderTarget.depthTexture ).__webglTexture );\n\n\t\t\t\t}\n\n\t\t\t\tconst texture = renderTarget.texture;\n\n\t\t\t\tif ( texture.isData3DTexture || texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tisRenderTarget3D = true;\n\n\t\t\t\t}\n\n\t\t\t\tconst __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\t\t\tif ( Array.isArray( __webglFramebuffer[ activeCubeFace ] ) ) {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ][ activeMipmapLevel ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tisCube = true;\n\n\t\t\t\t} else if ( ( capabilities.isWebGL2 && renderTarget.samples > 0 ) && textures.useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t\tframebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( Array.isArray( __webglFramebuffer ) ) {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeMipmapLevel ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t} else {\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t}\n\n\t\t\tconst framebufferBound = state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( framebufferBound && capabilities.drawBuffers && useDefaultFramebuffer ) {\n\n\t\t\t\tstate.drawBuffers( renderTarget, framebuffer );\n\n\t\t\t}\n\n\t\t\tstate.viewport( _currentViewport );\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t\t} else if ( isRenderTarget3D ) {\n\n\t\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t\tconst layer = activeCubeFace || 0;\n\t\t\t\t_gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureProperties.__webglTexture, activeMipmapLevel || 0, layer );\n\n\t\t\t}\n\n\t\t\t_currentMaterialId = - 1; // reset current material to ensure correct uniform bindings\n\n\t\t};\n\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) {\n\n\t\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t\t}\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\ttry {\n\n\t\t\t\t\tconst texture = renderTarget.texture;\n\t\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\t\tif ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || ( capabilities.isWebGL2 && extensions.has( 'EXT_color_buffer_float' ) ) );\n\n\t\t\t\t\tif ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t\t! ( textureType === FloatType && ( capabilities.isWebGL2 || extensions.has( 'OES_texture_float' ) || extensions.has( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t\t! halfFloatSupportedByExt ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\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} finally {\n\n\t\t\t\t\t// restore framebuffer of current render target if necessary\n\n\t\t\t\t\tconst framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.copyFramebufferToTexture = function ( position, texture, level = 0 ) {\n\n\t\t\tconst levelScale = Math.pow( 2, - level );\n\t\t\tconst width = Math.floor( texture.image.width * levelScale );\n\t\t\tconst height = Math.floor( texture.image.height * levelScale );\n\n\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t\t_gl.copyTexSubImage2D( _gl.TEXTURE_2D, level, 0, 0, position.x, position.y, width, height );\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\tthis.copyTextureToTexture = function ( position, srcTexture, dstTexture, level = 0 ) {\n\n\t\t\tconst width = srcTexture.image.width;\n\t\t\tconst height = srcTexture.image.height;\n\t\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\t\tconst glType = utils.convert( dstTexture.type );\n\n\t\t\ttextures.setTexture2D( dstTexture, 0 );\n\n\t\t\t// As another texture upload may have changed pixelStorei\n\t\t\t// parameters, make sure they are correct for the dstTexture\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );\n\n\t\t\tif ( srcTexture.isDataTexture ) {\n\n\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data );\n\n\t\t\t} else {\n\n\t\t\t\tif ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\t\t_gl.compressedTexSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, srcTexture.mipmaps[ 0 ].width, srcTexture.mipmaps[ 0 ].height, glFormat, srcTexture.mipmaps[ 0 ].data );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, glFormat, glType, srcTexture.image );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Generate mipmaps only when copying level 0\n\t\t\tif ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\tthis.copyTextureToTexture3D = function ( sourceBox, position, srcTexture, dstTexture, level = 0 ) {\n\n\t\t\tif ( _this.isWebGL1Renderer ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst width = sourceBox.max.x - sourceBox.min.x + 1;\n\t\t\tconst height = sourceBox.max.y - sourceBox.min.y + 1;\n\t\t\tconst depth = sourceBox.max.z - sourceBox.min.z + 1;\n\t\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\t\tconst glType = utils.convert( dstTexture.type );\n\t\t\tlet glTarget;\n\n\t\t\tif ( dstTexture.isData3DTexture ) {\n\n\t\t\t\ttextures.setTexture3D( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_3D;\n\n\t\t\t} else if ( dstTexture.isDataArrayTexture ) {\n\n\t\t\t\ttextures.setTexture2DArray( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );\n\n\t\t\tconst unpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );\n\t\t\tconst unpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );\n\t\t\tconst unpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );\n\t\t\tconst unpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );\n\t\t\tconst unpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );\n\n\t\t\tconst image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ 0 ] : srcTexture.image;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, sourceBox.min.x );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, sourceBox.min.y );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, sourceBox.min.z );\n\n\t\t\tif ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {\n\n\t\t\t\t_gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image.data );\n\n\t\t\t} else {\n\n\t\t\t\tif ( srcTexture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture.' );\n\t\t\t\t\t_gl.compressedTexSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, image.data );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, unpackRowLen );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, unpackImageHeight );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, unpackSkipPixels );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, unpackSkipRows );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, unpackSkipImages );\n\n\t\t\t// Generate mipmaps only when copying level 0\n\t\t\tif ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( glTarget );\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\tthis.initTexture = function ( texture ) {\n\n\t\t\tif ( texture.isCubeTexture ) {\n\n\t\t\t\ttextures.setTextureCube( texture, 0 );\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\ttextures.setTexture3D( texture, 0 );\n\n\t\t\t} else if ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\t\ttextures.setTexture2DArray( texture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\tthis.resetState = function () {\n\n\t\t\t_currentActiveCubeFace = 0;\n\t\t\t_currentActiveMipmapLevel = 0;\n\t\t\t_currentRenderTarget = null;\n\n\t\t\tstate.reset();\n\t\t\tbindingStates.reset();\n\n\t\t};\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\tget coordinateSystem() {\n\n\t\treturn WebGLCoordinateSystem;\n\n\t}\n\n\tget outputColorSpace() {\n\n\t\treturn this._outputColorSpace;\n\n\t}\n\n\tset outputColorSpace( colorSpace ) {\n\n\t\tthis._outputColorSpace = colorSpace;\n\n\t\tconst gl = this.getContext();\n\t\tgl.drawingBufferColorSpace = colorSpace === DisplayP3ColorSpace ? 'display-p3' : 'srgb';\n\t\tgl.unpackColorSpace = ColorManagement.workingColorSpace === LinearDisplayP3ColorSpace ? 'display-p3' : 'srgb';\n\n\t}\n\n\tget physicallyCorrectLights() { // @deprecated, r150\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: The property .physicallyCorrectLights has been removed. Set renderer.useLegacyLights instead.' );\n\t\treturn ! this.useLegacyLights;\n\n\t}\n\n\tset physicallyCorrectLights( value ) { // @deprecated, r150\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: The property .physicallyCorrectLights has been removed. Set renderer.useLegacyLights instead.' );\n\t\tthis.useLegacyLights = ! value;\n\n\t}\n\n\tget outputEncoding() { // @deprecated, r152\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: Property .outputEncoding has been removed. Use .outputColorSpace instead.' );\n\t\treturn this.outputColorSpace === SRGBColorSpace ? sRGBEncoding : LinearEncoding;\n\n\t}\n\n\tset outputEncoding( encoding ) { // @deprecated, r152\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: Property .outputEncoding has been removed. Use .outputColorSpace instead.' );\n\t\tthis.outputColorSpace = encoding === sRGBEncoding ? SRGBColorSpace : LinearSRGBColorSpace;\n\n\t}\n\n\tget useLegacyLights() { // @deprecated, r155\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: The property .useLegacyLights has been deprecated. Migrate your lighting according to the following guide: https://discourse.threejs.org/t/updates-to-lighting-in-three-js-r155/53733.' );\n\t\treturn this._useLegacyLights;\n\n\t}\n\n\tset useLegacyLights( value ) { // @deprecated, r155\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: The property .useLegacyLights has been deprecated. Migrate your lighting according to the following guide: https://discourse.threejs.org/t/updates-to-lighting-in-three-js-r155/53733.' );\n\t\tthis._useLegacyLights = value;\n\n\t}\n\n}\n\nclass WebGL1Renderer extends WebGLRenderer {}\n\nWebGL1Renderer.prototype.isWebGL1Renderer = true;\n\nclass FogExp2 {\n\n\tconstructor( color, density = 0.00025 ) {\n\n\t\tthis.isFogExp2 = true;\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\t\tthis.density = density;\n\n\t}\n\n\tclone() {\n\n\t\treturn new FogExp2( this.color, this.density );\n\n\t}\n\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tname: this.name,\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t}\n\n}\n\nclass Fog {\n\n\tconstructor( color, near = 1, far = 1000 ) {\n\n\t\tthis.isFog = true;\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Fog( this.color, this.near, this.far );\n\n\t}\n\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tname: this.name,\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t}\n\n}\n\nclass Scene extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isScene = true;\n\n\t\tthis.type = 'Scene';\n\n\t\tthis.background = null;\n\t\tthis.environment = null;\n\t\tthis.fog = null;\n\n\t\tthis.backgroundBlurriness = 0;\n\t\tthis.backgroundIntensity = 1;\n\n\t\tthis.overrideMaterial = null;\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.environment !== null ) this.environment = source.environment.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\n\t\tthis.backgroundBlurriness = source.backgroundBlurriness;\n\t\tthis.backgroundIntensity = source.backgroundIntensity;\n\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\t\tif ( this.backgroundBlurriness > 0 ) data.object.backgroundBlurriness = this.backgroundBlurriness;\n\t\tif ( this.backgroundIntensity !== 1 ) data.object.backgroundIntensity = this.backgroundIntensity;\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass InterleavedBuffer {\n\n\tconstructor( array, stride ) {\n\n\t\tthis.isInterleavedBuffer = true;\n\n\t\tthis.array = array;\n\t\tthis.stride = stride;\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\tthis.usage = StaticDrawUsage;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.version = 0;\n\n\t\tthis.uuid = generateUUID();\n\n\t}\n\n\tonUploadCallback() {}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\tcopy( 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.usage = source.usage;\n\n\t\treturn this;\n\n\t}\n\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.stride;\n\t\tindex2 *= attribute.stride;\n\n\t\tfor ( let 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( value, offset = 0 ) {\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = this.array.slice( 0 ).buffer;\n\n\t\t}\n\n\t\tconst array = new this.array.constructor( data.arrayBuffers[ this.array.buffer._uuid ] );\n\n\t\tconst ib = new this.constructor( array, this.stride );\n\t\tib.setUsage( this.usage );\n\n\t\treturn ib;\n\n\t}\n\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\t// generate UUID for array buffer if necessary\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = Array.from( new Uint32Array( this.array.buffer ) );\n\n\t\t}\n\n\t\t//\n\n\t\treturn {\n\t\t\tuuid: this.uuid,\n\t\t\tbuffer: this.array.buffer._uuid,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tstride: this.stride\n\t\t};\n\n\t}\n\n}\n\nconst _vector$5 = /*@__PURE__*/ new Vector3();\n\nclass InterleavedBufferAttribute {\n\n\tconstructor( interleavedBuffer, itemSize, offset, normalized = false ) {\n\n\t\tthis.isInterleavedBufferAttribute = true;\n\n\t\tthis.name = '';\n\n\t\tthis.data = interleavedBuffer;\n\t\tthis.itemSize = itemSize;\n\t\tthis.offset = offset;\n\n\t\tthis.normalized = normalized;\n\n\t}\n\n\tget count() {\n\n\t\treturn this.data.count;\n\n\t}\n\n\tget array() {\n\n\t\treturn this.data.array;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tthis.data.needsUpdate = value;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.data.count; i < l; i ++ ) {\n\n\t\t\t_vector$5.fromBufferAttribute( this, i );\n\n\t\t\t_vector$5.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$5.x, _vector$5.y, _vector$5.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$5.fromBufferAttribute( this, i );\n\n\t\t\t_vector$5.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$5.x, _vector$5.y, _vector$5.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$5.fromBufferAttribute( this, i );\n\n\t\t\t_vector$5.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$5.x, _vector$5.y, _vector$5.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\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( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\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( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\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( index ) {\n\n\t\tlet x = this.data.array[ index * this.data.stride + this.offset ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\tgetY( index ) {\n\n\t\tlet y = this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\tlet z = this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\tgetW( index ) {\n\n\t\tlet w = this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\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( index, x, y, z ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\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( index, x, y, z, w ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\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\tclone( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tconsole.log( 'THREE.InterleavedBufferAttribute.clone(): Cloning an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( new this.array.constructor( array ), this.itemSize, this.normalized );\n\n\t\t} else {\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.clone( data );\n\n\t\t\t}\n\n\t\t\treturn new InterleavedBufferAttribute( data.interleavedBuffers[ this.data.uuid ], this.itemSize, this.offset, this.normalized );\n\n\t\t}\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tconsole.log( 'THREE.InterleavedBufferAttribute.toJSON(): Serializing an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// de-interleave data and save it as an ordinary buffer attribute for now\n\n\t\t\treturn {\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\ttype: this.array.constructor.name,\n\t\t\t\tarray: array,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t} else {\n\n\t\t\t// save as true interleaved attribute\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.toJSON( data );\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tisInterleavedBufferAttribute: true,\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\tdata: this.data.uuid,\n\t\t\t\toffset: this.offset,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t}\n\n\t}\n\n}\n\nclass SpriteMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isSpriteMaterial = true;\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.rotation = 0;\n\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.transparent = true;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nlet _geometry;\n\nconst _intersectPoint = /*@__PURE__*/ new Vector3();\nconst _worldScale = /*@__PURE__*/ new Vector3();\nconst _mvPosition = /*@__PURE__*/ new Vector3();\n\nconst _alignedPosition = /*@__PURE__*/ new Vector2();\nconst _rotatedPosition = /*@__PURE__*/ new Vector2();\nconst _viewWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _vA = /*@__PURE__*/ new Vector3();\nconst _vB = /*@__PURE__*/ new Vector3();\nconst _vC = /*@__PURE__*/ new Vector3();\n\nconst _uvA = /*@__PURE__*/ new Vector2();\nconst _uvB = /*@__PURE__*/ new Vector2();\nconst _uvC = /*@__PURE__*/ new Vector2();\n\nclass Sprite extends Object3D {\n\n\tconstructor( material = new SpriteMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.isSprite = true;\n\n\t\tthis.type = 'Sprite';\n\n\t\tif ( _geometry === undefined ) {\n\n\t\t\t_geometry = new BufferGeometry();\n\n\t\t\tconst float32Array = new Float32Array( [\n\t\t\t\t- 0.5, - 0.5, 0, 0, 0,\n\t\t\t\t0.5, - 0.5, 0, 1, 0,\n\t\t\t\t0.5, 0.5, 0, 1, 1,\n\t\t\t\t- 0.5, 0.5, 0, 0, 1\n\t\t\t] );\n\n\t\t\tconst interleavedBuffer = new InterleavedBuffer( float32Array, 5 );\n\n\t\t\t_geometry.setIndex( [ 0, 1, 2,\t0, 2, 3 ] );\n\t\t\t_geometry.setAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) );\n\t\t\t_geometry.setAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) );\n\n\t\t}\n\n\t\tthis.geometry = _geometry;\n\t\tthis.material = material;\n\n\t\tthis.center = new Vector2( 0.5, 0.5 );\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tif ( raycaster.camera === null ) {\n\n\t\t\tconsole.error( 'THREE.Sprite: \"Raycaster.camera\" needs to be set in order to raycast against sprites.' );\n\n\t\t}\n\n\t\t_worldScale.setFromMatrixScale( this.matrixWorld );\n\n\t\t_viewWorldMatrix.copy( raycaster.camera.matrixWorld );\n\t\tthis.modelViewMatrix.multiplyMatrices( raycaster.camera.matrixWorldInverse, this.matrixWorld );\n\n\t\t_mvPosition.setFromMatrixPosition( this.modelViewMatrix );\n\n\t\tif ( raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) {\n\n\t\t\t_worldScale.multiplyScalar( - _mvPosition.z );\n\n\t\t}\n\n\t\tconst rotation = this.material.rotation;\n\t\tlet sin, cos;\n\n\t\tif ( rotation !== 0 ) {\n\n\t\t\tcos = Math.cos( rotation );\n\t\t\tsin = Math.sin( rotation );\n\n\t\t}\n\n\t\tconst center = this.center;\n\n\t\ttransformVertex( _vA.set( - 0.5, - 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vB.set( 0.5, - 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vC.set( 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\n\t\t_uvA.set( 0, 0 );\n\t\t_uvB.set( 1, 0 );\n\t\t_uvC.set( 1, 1 );\n\n\t\t// check first triangle\n\t\tlet intersect = raycaster.ray.intersectTriangle( _vA, _vB, _vC, false, _intersectPoint );\n\n\t\tif ( intersect === null ) {\n\n\t\t\t// check second triangle\n\t\t\ttransformVertex( _vB.set( - 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\t\t_uvB.set( 0, 1 );\n\n\t\t\tintersect = raycaster.ray.intersectTriangle( _vA, _vC, _vB, false, _intersectPoint );\n\t\t\tif ( intersect === null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( _intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tpoint: _intersectPoint.clone(),\n\t\t\tuv: Triangle.getInterpolation( _intersectPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() ),\n\t\t\tface: null,\n\t\t\tobject: this\n\n\t\t} );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.center !== undefined ) this.center.copy( source.center );\n\n\t\tthis.material = source.material;\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) {\n\n\t// compute position in camera space\n\t_alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale );\n\n\t// to check if rotation is not zero\n\tif ( sin !== undefined ) {\n\n\t\t_rotatedPosition.x = ( cos * _alignedPosition.x ) - ( sin * _alignedPosition.y );\n\t\t_rotatedPosition.y = ( sin * _alignedPosition.x ) + ( cos * _alignedPosition.y );\n\n\t} else {\n\n\t\t_rotatedPosition.copy( _alignedPosition );\n\n\t}\n\n\n\tvertexPosition.copy( mvPosition );\n\tvertexPosition.x += _rotatedPosition.x;\n\tvertexPosition.y += _rotatedPosition.y;\n\n\t// transform to world space\n\tvertexPosition.applyMatrix4( _viewWorldMatrix );\n\n}\n\nconst _v1$2 = /*@__PURE__*/ new Vector3();\nconst _v2$1 = /*@__PURE__*/ new Vector3();\n\nclass LOD extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis._currentLevel = 0;\n\n\t\tthis.type = 'LOD';\n\n\t\tObject.defineProperties( this, {\n\t\t\tlevels: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: []\n\t\t\t},\n\t\t\tisLOD: {\n\t\t\t\tvalue: true,\n\t\t\t}\n\t\t} );\n\n\t\tthis.autoUpdate = true;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tconst levels = source.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tthis.addLevel( level.object.clone(), level.distance, level.hysteresis );\n\n\t\t}\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\taddLevel( object, distance = 0, hysteresis = 0 ) {\n\n\t\tdistance = Math.abs( distance );\n\n\t\tconst levels = this.levels;\n\n\t\tlet l;\n\n\t\tfor ( 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, hysteresis: hysteresis, object: object } );\n\n\t\tthis.add( object );\n\n\t\treturn this;\n\n\t}\n\n\tgetCurrentLevel() {\n\n\t\treturn this._currentLevel;\n\n\t}\n\n\n\n\tgetObjectForDistance( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance < levelDistance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = raycaster.ray.origin.distanceTo( _v1$2 );\n\n\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t}\n\n\t}\n\n\tupdate( camera ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 1 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t_v2$1.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = _v1$2.distanceTo( _v2$1 ) / camera.zoom;\n\n\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance >= levelDistance ) {\n\n\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._currentLevel = i - 1;\n\n\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.autoUpdate === false ) data.object.autoUpdate = false;\n\n\t\tdata.object.levels = [];\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst 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\thysteresis: level.hysteresis\n\t\t\t} );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _basePosition = /*@__PURE__*/ new Vector3();\n\nconst _skinIndex = /*@__PURE__*/ new Vector4();\nconst _skinWeight = /*@__PURE__*/ new Vector4();\n\nconst _vector3 = /*@__PURE__*/ new Vector3();\nconst _matrix4 = /*@__PURE__*/ new Matrix4();\nconst _vertex = /*@__PURE__*/ new Vector3();\n\nconst _sphere$3 = /*@__PURE__*/ new Sphere();\nconst _inverseMatrix$2 = /*@__PURE__*/ new Matrix4();\nconst _ray$2 = /*@__PURE__*/ new Ray();\n\nclass SkinnedMesh extends Mesh {\n\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isSkinnedMesh = true;\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\tthis.bindMode = AttachedBindMode;\n\t\tthis.bindMatrix = new Matrix4();\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t}\n\n\tcomputeBoundingBox() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tthis.boundingBox.makeEmpty();\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\tthis.getVertexPosition( i, _vertex );\n\t\t\tthis.boundingBox.expandByPoint( _vertex );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.makeEmpty();\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\tthis.getVertexPosition( i, _vertex );\n\t\t\tthis.boundingSphere.expandByPoint( _vertex );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.bindMode = source.bindMode;\n\t\tthis.bindMatrix.copy( source.bindMatrix );\n\t\tthis.bindMatrixInverse.copy( source.bindMatrixInverse );\n\n\t\tthis.skeleton = source.skeleton;\n\n\t\tif ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone();\n\t\tif ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone();\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// test with bounding sphere in world space\n\n\t\tif ( this.boundingSphere === null ) this.computeBoundingSphere();\n\n\t\t_sphere$3.copy( this.boundingSphere );\n\t\t_sphere$3.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$3 ) === false ) return;\n\n\t\t// convert ray to local space of skinned mesh\n\n\t\t_inverseMatrix$2.copy( matrixWorld ).invert();\n\t\t_ray$2.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$2 );\n\n\t\t// test with bounding box in local space\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tif ( _ray$2.intersectsBox( this.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\t// test for intersections with geometry\n\n\t\tthis._computeIntersections( raycaster, intersects, _ray$2 );\n\n\t}\n\n\tgetVertexPosition( index, target ) {\n\n\t\tsuper.getVertexPosition( index, target );\n\n\t\tthis.applyBoneTransform( index, target );\n\n\t\treturn target;\n\n\t}\n\n\tbind( 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.copy( bindMatrix ).invert();\n\n\t}\n\n\tpose() {\n\n\t\tthis.skeleton.pose();\n\n\t}\n\n\tnormalizeSkinWeights() {\n\n\t\tconst vector = new Vector4();\n\n\t\tconst skinWeight = this.geometry.attributes.skinWeight;\n\n\t\tfor ( let i = 0, l = skinWeight.count; i < l; i ++ ) {\n\n\t\t\tvector.fromBufferAttribute( skinWeight, i );\n\n\t\t\tconst scale = 1.0 / vector.manhattanLength();\n\n\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\tvector.multiplyScalar( scale );\n\n\t\t\t} else {\n\n\t\t\t\tvector.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t}\n\n\t\t\tskinWeight.setXYZW( i, vector.x, vector.y, vector.z, vector.w );\n\n\t\t}\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.bindMode === AttachedBindMode ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.matrixWorld ).invert();\n\n\t\t} else if ( this.bindMode === DetachedBindMode ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.bindMatrix ).invert();\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\tapplyBoneTransform( index, vector ) {\n\n\t\tconst skeleton = this.skeleton;\n\t\tconst geometry = this.geometry;\n\n\t\t_skinIndex.fromBufferAttribute( geometry.attributes.skinIndex, index );\n\t\t_skinWeight.fromBufferAttribute( geometry.attributes.skinWeight, index );\n\n\t\t_basePosition.copy( vector ).applyMatrix4( this.bindMatrix );\n\n\t\tvector.set( 0, 0, 0 );\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tconst weight = _skinWeight.getComponent( i );\n\n\t\t\tif ( weight !== 0 ) {\n\n\t\t\t\tconst boneIndex = _skinIndex.getComponent( i );\n\n\t\t\t\t_matrix4.multiplyMatrices( skeleton.bones[ boneIndex ].matrixWorld, skeleton.boneInverses[ boneIndex ] );\n\n\t\t\t\tvector.addScaledVector( _vector3.copy( _basePosition ).applyMatrix4( _matrix4 ), weight );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn vector.applyMatrix4( this.bindMatrixInverse );\n\n\t}\n\n\tboneTransform( index, vector ) { // @deprecated, r151\n\n\t\tconsole.warn( 'THREE.SkinnedMesh: .boneTransform() was renamed to .applyBoneTransform() in r151.' );\n\t\treturn this.applyBoneTransform( index, vector );\n\n\t}\n\n\n}\n\nclass Bone extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isBone = true;\n\n\t\tthis.type = 'Bone';\n\n\t}\n\n}\n\nclass DataTexture extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, format, type, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, colorSpace ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\tthis.isDataTexture = true;\n\n\t\tthis.image = { data: data, width: width, height: height };\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nconst _offsetMatrix = /*@__PURE__*/ new Matrix4();\nconst _identityMatrix = /*@__PURE__*/ new Matrix4();\n\nclass Skeleton {\n\n\tconstructor( bones = [], boneInverses = [] ) {\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.bones = bones.slice( 0 );\n\t\tthis.boneInverses = boneInverses;\n\t\tthis.boneMatrices = null;\n\n\t\tthis.boneTexture = null;\n\t\tthis.boneTextureSize = 0;\n\n\t\tthis.init();\n\n\t}\n\n\tinit() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tthis.boneMatrices = new Float32Array( bones.length * 16 );\n\n\t\t// calculate inverse bone matrices if necessary\n\n\t\tif ( boneInverses.length === 0 ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\t// handle special case\n\n\t\t\tif ( bones.length !== boneInverses.length ) {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton: Number of inverse bone matrices does not match amount of bones.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcalculateInverses() {\n\n\t\tthis.boneInverses.length = 0;\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst inverse = new Matrix4();\n\n\t\t\tif ( this.bones[ i ] ) {\n\n\t\t\t\tinverse.copy( this.bones[ i ].matrixWorld ).invert();\n\n\t\t\t}\n\n\t\t\tthis.boneInverses.push( inverse );\n\n\t\t}\n\n\t}\n\n\tpose() {\n\n\t\t// recover the bind-time world matrices\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tbone.matrixWorld.copy( this.boneInverses[ i ] ).invert();\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 ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = 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.copy( bone.parent.matrixWorld ).invert();\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() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\t\tconst boneMatrices = this.boneMatrices;\n\t\tconst boneTexture = this.boneTexture;\n\n\t\t// flatten bone matrices to array\n\n\t\tfor ( let i = 0, il = bones.length; i < il; i ++ ) {\n\n\t\t\t// compute the offset between the current and the original transform\n\n\t\t\tconst matrix = bones[ i ] ? bones[ i ].matrixWorld : _identityMatrix;\n\n\t\t\t_offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] );\n\t\t\t_offsetMatrix.toArray( boneMatrices, i * 16 );\n\n\t\t}\n\n\t\tif ( boneTexture !== null ) {\n\n\t\t\tboneTexture.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new Skeleton( this.bones, this.boneInverses );\n\n\t}\n\n\tcomputeBoneTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = ceilPowerOfTwo( size );\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tboneMatrices.set( this.boneMatrices ); // copy current values\n\n\t\tconst boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );\n\t\tboneTexture.needsUpdate = true;\n\n\t\tthis.boneMatrices = boneMatrices;\n\t\tthis.boneTexture = boneTexture;\n\t\tthis.boneTextureSize = size;\n\n\t\treturn this;\n\n\t}\n\n\tgetBoneByName( name ) {\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst 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\tdispose( ) {\n\n\t\tif ( this.boneTexture !== null ) {\n\n\t\t\tthis.boneTexture.dispose();\n\n\t\t\tthis.boneTexture = null;\n\n\t\t}\n\n\t}\n\n\tfromJSON( json, bones ) {\n\n\t\tthis.uuid = json.uuid;\n\n\t\tfor ( let i = 0, l = json.bones.length; i < l; i ++ ) {\n\n\t\t\tconst uuid = json.bones[ i ];\n\t\t\tlet bone = bones[ uuid ];\n\n\t\t\tif ( bone === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton: No bone found with UUID:', uuid );\n\t\t\t\tbone = new Bone();\n\n\t\t\t}\n\n\t\t\tthis.bones.push( bone );\n\t\t\tthis.boneInverses.push( new Matrix4().fromArray( json.boneInverses[ i ] ) );\n\n\t\t}\n\n\t\tthis.init();\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.6,\n\t\t\t\ttype: 'Skeleton',\n\t\t\t\tgenerator: 'Skeleton.toJSON'\n\t\t\t},\n\t\t\tbones: [],\n\t\t\tboneInverses: []\n\t\t};\n\n\t\tdata.uuid = this.uuid;\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tfor ( let i = 0, l = bones.length; i < l; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\t\t\tdata.bones.push( bone.uuid );\n\n\t\t\tconst boneInverse = boneInverses[ i ];\n\t\t\tdata.boneInverses.push( boneInverse.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass InstancedBufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, itemSize, normalized );\n\n\t\tthis.isInstancedBufferAttribute = true;\n\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.meshPerAttribute = this.meshPerAttribute;\n\n\t\tdata.isInstancedBufferAttribute = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _instanceLocalMatrix = /*@__PURE__*/ new Matrix4();\nconst _instanceWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _instanceIntersects = [];\n\nconst _box3 = /*@__PURE__*/ new Box3();\nconst _identity = /*@__PURE__*/ new Matrix4();\nconst _mesh = /*@__PURE__*/ new Mesh();\nconst _sphere$2 = /*@__PURE__*/ new Sphere();\n\nclass InstancedMesh extends Mesh {\n\n\tconstructor( geometry, material, count ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isInstancedMesh = true;\n\n\t\tthis.instanceMatrix = new InstancedBufferAttribute( new Float32Array( count * 16 ), 16 );\n\t\tthis.instanceColor = null;\n\n\t\tthis.count = count;\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.setMatrixAt( i, _identity );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingBox() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst count = this.count;\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\tgeometry.computeBoundingBox();\n\n\t\t}\n\n\t\tthis.boundingBox.makeEmpty();\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.getMatrixAt( i, _instanceLocalMatrix );\n\n\t\t\t_box3.copy( geometry.boundingBox ).applyMatrix4( _instanceLocalMatrix );\n\n\t\t\tthis.boundingBox.union( _box3 );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst count = this.count;\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tif ( geometry.boundingSphere === null ) {\n\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.makeEmpty();\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.getMatrixAt( i, _instanceLocalMatrix );\n\n\t\t\t_sphere$2.copy( geometry.boundingSphere ).applyMatrix4( _instanceLocalMatrix );\n\n\t\t\tthis.boundingSphere.union( _sphere$2 );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.instanceMatrix.copy( source.instanceMatrix );\n\n\t\tif ( source.instanceColor !== null ) this.instanceColor = source.instanceColor.clone();\n\n\t\tthis.count = source.count;\n\n\t\tif ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone();\n\t\tif ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone();\n\n\t\treturn this;\n\n\t}\n\n\tgetColorAt( index, color ) {\n\n\t\tcolor.fromArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\tgetMatrixAt( index, matrix ) {\n\n\t\tmatrix.fromArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst raycastTimes = this.count;\n\n\t\t_mesh.geometry = this.geometry;\n\t\t_mesh.material = this.material;\n\n\t\tif ( _mesh.material === undefined ) return;\n\n\t\t// test with bounding sphere first\n\n\t\tif ( this.boundingSphere === null ) this.computeBoundingSphere();\n\n\t\t_sphere$2.copy( this.boundingSphere );\n\t\t_sphere$2.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$2 ) === false ) return;\n\n\t\t// now test each instance\n\n\t\tfor ( let instanceId = 0; instanceId < raycastTimes; instanceId ++ ) {\n\n\t\t\t// calculate the world matrix for each instance\n\n\t\t\tthis.getMatrixAt( instanceId, _instanceLocalMatrix );\n\n\t\t\t_instanceWorldMatrix.multiplyMatrices( matrixWorld, _instanceLocalMatrix );\n\n\t\t\t// the mesh represents this single instance\n\n\t\t\t_mesh.matrixWorld = _instanceWorldMatrix;\n\n\t\t\t_mesh.raycast( raycaster, _instanceIntersects );\n\n\t\t\t// process the result of raycast\n\n\t\t\tfor ( let i = 0, l = _instanceIntersects.length; i < l; i ++ ) {\n\n\t\t\t\tconst intersect = _instanceIntersects[ i ];\n\t\t\t\tintersect.instanceId = instanceId;\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_instanceIntersects.length = 0;\n\n\t\t}\n\n\t}\n\n\tsetColorAt( index, color ) {\n\n\t\tif ( this.instanceColor === null ) {\n\n\t\t\tthis.instanceColor = new InstancedBufferAttribute( new Float32Array( this.instanceMatrix.count * 3 ), 3 );\n\n\t\t}\n\n\t\tcolor.toArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\tsetMatrixAt( index, matrix ) {\n\n\t\tmatrix.toArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nclass LineBasicMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isLineBasicMaterial = true;\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.linewidth = 1;\n\t\tthis.linecap = 'round';\n\t\tthis.linejoin = 'round';\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _start$1 = /*@__PURE__*/ new Vector3();\nconst _end$1 = /*@__PURE__*/ new Vector3();\nconst _inverseMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _ray$1 = /*@__PURE__*/ new Ray();\nconst _sphere$1 = /*@__PURE__*/ new Sphere();\n\nclass Line extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new LineBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.isLine = true;\n\n\t\tthis.type = 'Line';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [ 0 ];\n\n\t\t\tfor ( let i = 1, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t_start$1.fromBufferAttribute( positionAttribute, i - 1 );\n\t\t\t\t_end$1.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i ] += _start$1.distanceTo( _end$1 );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Line.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$1.copy( geometry.boundingSphere );\n\t\t_sphere$1.applyMatrix4( matrixWorld );\n\t\t_sphere$1.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$1 ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix$1.copy( matrixWorld ).invert();\n\t\t_ray$1.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$1 );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst vStart = new Vector3();\n\t\tconst vEnd = new Vector3();\n\t\tconst interSegment = new Vector3();\n\t\tconst interRay = new Vector3();\n\t\tconst step = this.isLineSegments ? 2 : 1;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tconst a = index.getX( i );\n\t\t\t\tconst b = index.getX( i + 1 );\n\n\t\t\t\tvStart.fromBufferAttribute( positionAttribute, a );\n\t\t\t\tvEnd.fromBufferAttribute( positionAttribute, b );\n\n\t\t\t\tconst distSq = _ray$1.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\tif ( distSq > localThresholdSq ) continue;\n\n\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\tconst distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\tindex: i,\n\t\t\t\t\tface: null,\n\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\tobject: this\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tvStart.fromBufferAttribute( positionAttribute, i );\n\t\t\t\tvEnd.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\tconst distSq = _ray$1.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\tif ( distSq > localThresholdSq ) continue;\n\n\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\tconst distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\tindex: i,\n\t\t\t\t\tface: null,\n\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\tobject: this\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ 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}\n\nconst _start = /*@__PURE__*/ new Vector3();\nconst _end = /*@__PURE__*/ new Vector3();\n\nclass LineSegments extends Line {\n\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isLineSegments = true;\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [];\n\n\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i += 2 ) {\n\n\t\t\t\t_start.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t_end.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + _start.distanceTo( _end );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LineLoop extends Line {\n\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isLineLoop = true;\n\n\t\tthis.type = 'LineLoop';\n\n\t}\n\n}\n\nclass PointsMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isPointsMaterial = true;\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.size = 1;\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _inverseMatrix = /*@__PURE__*/ new Matrix4();\nconst _ray = /*@__PURE__*/ new Ray();\nconst _sphere = /*@__PURE__*/ new Sphere();\nconst _position$2 = /*@__PURE__*/ new Vector3();\n\nclass Points extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new PointsMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.isPoints = true;\n\n\t\tthis.type = 'Points';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Points.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere );\n\t\t_sphere.applyMatrix4( matrixWorld );\n\t\t_sphere.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix.copy( matrixWorld ).invert();\n\t\t_ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, il = end; i < il; i ++ ) {\n\n\t\t\t\tconst a = index.getX( i );\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, a );\n\n\t\t\t\ttestPoint( _position$2, a, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end; i < l; i ++ ) {\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\ttestPoint( _position$2, i, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ 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}\n\nfunction testPoint( point, index, localThresholdSq, matrixWorld, raycaster, intersects, object ) {\n\n\tconst rayPointDistanceSq = _ray.distanceSqToPoint( point );\n\n\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\tconst intersectPoint = new Vector3();\n\n\t\t_ray.closestPointToPoint( point, intersectPoint );\n\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\tpoint: intersectPoint,\n\t\t\tindex: index,\n\t\t\tface: null,\n\t\t\tobject: object\n\n\t\t} );\n\n\t}\n\n}\n\nclass VideoTexture extends Texture {\n\n\tconstructor( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.isVideoTexture = true;\n\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : LinearFilter;\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\n\t\tthis.generateMipmaps = false;\n\n\t\tconst scope = this;\n\n\t\tfunction updateVideo() {\n\n\t\t\tscope.needsUpdate = true;\n\t\t\tvideo.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t\tif ( 'requestVideoFrameCallback' in video ) {\n\n\t\t\tvideo.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.image ).copy( this );\n\n\t}\n\n\tupdate() {\n\n\t\tconst video = this.image;\n\t\tconst hasVideoFrameCallback = 'requestVideoFrameCallback' in video;\n\n\t\tif ( hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n}\n\nclass FramebufferTexture extends Texture {\n\n\tconstructor( width, height ) {\n\n\t\tsuper( { width, height } );\n\n\t\tthis.isFramebufferTexture = true;\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.generateMipmaps = false;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\nclass CompressedTexture extends Texture {\n\n\tconstructor( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, colorSpace ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\tthis.isCompressedTexture = true;\n\n\t\tthis.image = { width: width, height: height };\n\t\tthis.mipmaps = mipmaps;\n\n\t\t// no flipping for cube textures\n\t\t// (also flipping doesn't work for compressed textures )\n\n\t\tthis.flipY = false;\n\n\t\t// can't generate mipmaps for compressed textures\n\t\t// mips must be embedded in DDS files\n\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n}\n\nclass CompressedArrayTexture extends CompressedTexture {\n\n\tconstructor( mipmaps, width, height, depth, format, type ) {\n\n\t\tsuper( mipmaps, width, height, format, type );\n\n\t\tthis.isCompressedArrayTexture = true;\n\t\tthis.image.depth = depth;\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t}\n\n}\n\nclass CompressedCubeTexture extends CompressedTexture {\n\n\tconstructor( images, format, type ) {\n\n\t\tsuper( undefined, images[ 0 ].width, images[ 0 ].height, format, type, CubeReflectionMapping );\n\n\t\tthis.isCompressedCubeTexture = true;\n\t\tthis.isCubeTexture = true;\n\n\t\tthis.image = images;\n\n\t}\n\n}\n\nclass CanvasTexture extends Texture {\n\n\tconstructor( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.isCanvasTexture = true;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * Extensible curve object.\n *\n * Some common of curve methods:\n * .getPoint( t, optionalTarget ), .getTangent( t, optionalTarget )\n * .getPointAt( u, optionalTarget ), .getTangentAt( u, optionalTarget )\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\nclass Curve {\n\n\tconstructor() {\n\n\t\tthis.type = 'Curve';\n\n\t\tthis.arcLengthDivisions = 200;\n\n\t}\n\n\t// Virtual base class method to overwrite and implement in subclasses\n\t//\t- t [0 .. 1]\n\n\tgetPoint( /* 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( u, optionalTarget ) {\n\n\t\tconst 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( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let 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( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let 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() {\n\n\t\tconst 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( 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\tconst cache = [];\n\t\tlet current, last = this.getPoint( 0 );\n\t\tlet sum = 0;\n\n\t\tcache.push( 0 );\n\n\t\tfor ( let 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() {\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( u, distance ) {\n\n\t\tconst arcLengths = this.getLengths();\n\n\t\tlet i = 0;\n\t\tconst il = arcLengths.length;\n\n\t\tlet 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\tlet 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\tconst lengthBefore = arcLengths[ i ];\n\t\tconst lengthAfter = arcLengths[ i + 1 ];\n\n\t\tconst segmentLength = lengthAfter - lengthBefore;\n\n\t\t// determine where we are between the 'before' and 'after' points\n\n\t\tconst segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t// add that fractional amount to t\n\n\t\tconst 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( t, optionalTarget ) {\n\n\t\tconst delta = 0.0001;\n\t\tlet t1 = t - delta;\n\t\tlet 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\tconst pt1 = this.getPoint( t1 );\n\t\tconst pt2 = this.getPoint( t2 );\n\n\t\tconst tangent = optionalTarget || ( ( pt1.isVector2 ) ? new Vector2() : new Vector3() );\n\n\t\ttangent.copy( pt2 ).sub( pt1 ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getTangent( t, optionalTarget );\n\n\t}\n\n\tcomputeFrenetFrames( segments, closed ) {\n\n\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\tconst normal = new Vector3();\n\n\t\tconst tangents = [];\n\t\tconst normals = [];\n\t\tconst binormals = [];\n\n\t\tconst vec = new Vector3();\n\t\tconst mat = new Matrix4();\n\n\t\t// compute the tangent vectors for each segment on the curve\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst u = i / segments;\n\n\t\t\ttangents[ i ] = this.getTangentAt( u, new Vector3() );\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\tlet min = Number.MAX_VALUE;\n\t\tconst tx = Math.abs( tangents[ 0 ].x );\n\t\tconst ty = Math.abs( tangents[ 0 ].y );\n\t\tconst 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 ( let 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\tconst theta = Math.acos( 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\tlet theta = Math.acos( 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 ( let 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() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.arcLengthDivisions = source.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.6,\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( json ) {\n\n\t\tthis.arcLengthDivisions = json.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass EllipseCurve extends Curve {\n\n\tconstructor( aX = 0, aY = 0, xRadius = 1, yRadius = 1, aStartAngle = 0, aEndAngle = Math.PI * 2, aClockwise = false, aRotation = 0 ) {\n\n\t\tsuper();\n\n\t\tthis.isEllipseCurve = true;\n\n\t\tthis.type = 'EllipseCurve';\n\n\t\tthis.aX = aX;\n\t\tthis.aY = aY;\n\n\t\tthis.xRadius = xRadius;\n\t\tthis.yRadius = yRadius;\n\n\t\tthis.aStartAngle = aStartAngle;\n\t\tthis.aEndAngle = aEndAngle;\n\n\t\tthis.aClockwise = aClockwise;\n\n\t\tthis.aRotation = aRotation;\n\n\t}\n\n\tgetPoint( t, optionalTarget ) {\n\n\t\tconst point = optionalTarget || new Vector2();\n\n\t\tconst twoPi = Math.PI * 2;\n\t\tlet deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tconst samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t\t// ensures that deltaAngle is 0 .. 2 PI\n\t\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\t\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\t\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\t\tif ( samePoints ) {\n\n\t\t\t\tdeltaAngle = 0;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\t\tdeltaAngle = - twoPi;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst angle = this.aStartAngle + t * deltaAngle;\n\t\tlet x = this.aX + this.xRadius * Math.cos( angle );\n\t\tlet y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tconst cos = Math.cos( this.aRotation );\n\t\t\tconst sin = Math.sin( this.aRotation );\n\n\t\t\tconst tx = x - this.aX;\n\t\t\tconst ty = y - this.aY;\n\n\t\t\t// Rotate the point about the center of the ellipse.\n\t\t\tx = tx * cos - ty * sin + this.aX;\n\t\t\ty = tx * sin + ty * cos + this.aY;\n\n\t\t}\n\n\t\treturn point.set( x, y );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.aX = source.aX;\n\t\tthis.aY = source.aY;\n\n\t\tthis.xRadius = source.xRadius;\n\t\tthis.yRadius = source.yRadius;\n\n\t\tthis.aStartAngle = source.aStartAngle;\n\t\tthis.aEndAngle = source.aEndAngle;\n\n\t\tthis.aClockwise = source.aClockwise;\n\n\t\tthis.aRotation = source.aRotation;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.aX = this.aX;\n\t\tdata.aY = this.aY;\n\n\t\tdata.xRadius = this.xRadius;\n\t\tdata.yRadius = this.yRadius;\n\n\t\tdata.aStartAngle = this.aStartAngle;\n\t\tdata.aEndAngle = this.aEndAngle;\n\n\t\tdata.aClockwise = this.aClockwise;\n\n\t\tdata.aRotation = this.aRotation;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.aX = json.aX;\n\t\tthis.aY = json.aY;\n\n\t\tthis.xRadius = json.xRadius;\n\t\tthis.yRadius = json.yRadius;\n\n\t\tthis.aStartAngle = json.aStartAngle;\n\t\tthis.aEndAngle = json.aEndAngle;\n\n\t\tthis.aClockwise = json.aClockwise;\n\n\t\tthis.aRotation = json.aRotation;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass ArcCurve extends EllipseCurve {\n\n\tconstructor( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tsuper( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\tthis.isArcCurve = true;\n\n\t\tthis.type = 'ArcCurve';\n\n\t}\n\n}\n\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\tlet 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\tlet t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tlet 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\tconst t2 = t * t;\n\t\t\tconst 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\nconst tmp = /*@__PURE__*/ new Vector3();\nconst px = /*@__PURE__*/ new CubicPoly();\nconst py = /*@__PURE__*/ new CubicPoly();\nconst pz = /*@__PURE__*/ new CubicPoly();\n\nclass CatmullRomCurve3 extends Curve {\n\n\tconstructor( points = [], closed = false, curveType = 'centripetal', tension = 0.5 ) {\n\n\t\tsuper();\n\n\t\tthis.isCatmullRomCurve3 = true;\n\n\t\tthis.type = 'CatmullRomCurve3';\n\n\t\tthis.points = points;\n\t\tthis.closed = closed;\n\t\tthis.curveType = curveType;\n\t\tthis.tension = tension;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst l = points.length;\n\n\t\tconst p = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\tlet intPoint = Math.floor( p );\n\t\tlet weight = p - intPoint;\n\n\t\tif ( this.closed ) {\n\n\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l;\n\n\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\tintPoint = l - 2;\n\t\t\tweight = 1;\n\n\t\t}\n\n\t\tlet p0, p3; // 4 points (p1 & p2 defined below)\n\n\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate first point\n\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\tp0 = tmp;\n\n\t\t}\n\n\t\tconst p1 = points[ intPoint % l ];\n\t\tconst p2 = points[ ( intPoint + 1 ) % l ];\n\n\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate last point\n\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\tp3 = tmp;\n\n\t\t}\n\n\t\tif ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) {\n\n\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\tconst pow = this.curveType === 'chordal' ? 0.5 : 0.25;\n\t\t\tlet dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\tlet dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\tlet dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t// safety check for repeated points\n\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t} else if ( this.curveType === 'catmullrom' ) {\n\n\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension );\n\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension );\n\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension );\n\n\t\t}\n\n\t\tpoint.set(\n\t\t\tpx.calc( weight ),\n\t\t\tpy.calc( weight ),\n\t\t\tpz.calc( weight )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\tthis.closed = source.closed;\n\t\tthis.curveType = source.curveType;\n\t\tthis.tension = source.tension;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\tdata.closed = this.closed;\n\t\tdata.curveType = this.curveType;\n\t\tdata.tension = this.tension;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector3().fromArray( point ) );\n\n\t\t}\n\n\t\tthis.closed = json.closed;\n\t\tthis.curveType = json.curveType;\n\t\tthis.tension = json.tension;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Bezier Curves formulas obtained from\n * https://en.wikipedia.org/wiki/B%C3%A9zier_curve\n */\n\nfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\tconst v0 = ( p2 - p0 ) * 0.5;\n\tconst v1 = ( p3 - p1 ) * 0.5;\n\tconst t2 = t * t;\n\tconst 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\tconst 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\tconst k = 1 - t;\n\treturn k * k * k * p;\n\n}\n\nfunction CubicBezierP1( t, p ) {\n\n\tconst 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\nclass CubicBezierCurve extends Curve {\n\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\tthis.isCubicBezierCurve = true;\n\n\t\tthis.type = 'CubicBezierCurve';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass CubicBezierCurve3 extends Curve {\n\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\tthis.isCubicBezierCurve3 = true;\n\n\t\tthis.type = 'CubicBezierCurve3';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LineCurve extends Curve {\n\n\tconstructor( v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\tthis.isLineCurve = true;\n\n\t\tthis.type = 'LineCurve';\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector2() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LineCurve3 extends Curve {\n\n\tconstructor( v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\tthis.isLineCurve3 = true;\n\n\t\tthis.type = 'LineCurve3';\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector3() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass QuadraticBezierCurve extends Curve {\n\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\tthis.isQuadraticBezierCurve = true;\n\n\t\tthis.type = 'QuadraticBezierCurve';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass QuadraticBezierCurve3 extends Curve {\n\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\tthis.isQuadraticBezierCurve3 = true;\n\n\t\tthis.type = 'QuadraticBezierCurve3';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass SplineCurve extends Curve {\n\n\tconstructor( points = [] ) {\n\n\t\tsuper();\n\n\t\tthis.isSplineCurve = true;\n\n\t\tthis.type = 'SplineCurve';\n\n\t\tthis.points = points;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst p = ( points.length - 1 ) * t;\n\n\t\tconst intPoint = Math.floor( p );\n\t\tconst weight = p - intPoint;\n\n\t\tconst p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tconst p1 = points[ intPoint ];\n\t\tconst p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tconst p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\tpoint.set(\n\t\t\tCatmullRom( weight, p0.x, p1.x, p2.x, p3.x ),\n\t\t\tCatmullRom( weight, p0.y, p1.y, p2.y, p3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector2().fromArray( point ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nvar Curves = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\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 *\tCurved Path - a curve path is simply a array of connected\n * curves, but retains the api of a curve\n **************************************************************/\n\nclass CurvePath extends Curve {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'CurvePath';\n\n\t\tthis.curves = [];\n\t\tthis.autoClose = false; // Automatically closes the path\n\n\t}\n\n\tadd( curve ) {\n\n\t\tthis.curves.push( curve );\n\n\t}\n\n\tclosePath() {\n\n\t\t// Add a line curve if start and end of lines are not connected\n\t\tconst startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\tconst endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\tconst lineType = ( startPoint.isVector2 === true ) ? 'LineCurve' : 'LineCurve3';\n\t\t\tthis.curves.push( new Curves[ lineType ]( endPoint, startPoint ) );\n\n\t\t}\n\n\t\treturn this;\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( t, optionalTarget ) {\n\n\t\tconst d = t * this.getLength();\n\t\tconst curveLengths = this.getCurveLengths();\n\t\tlet 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\tconst diff = curveLengths[ i ] - d;\n\t\t\t\tconst curve = this.curves[ i ];\n\n\t\t\t\tconst segmentLength = curve.getLength();\n\t\t\t\tconst u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\treturn curve.getPointAt( u, optionalTarget );\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 <d\n\n\t}\n\n\t// We cannot use the default THREE.Curve getPoint() with getLength() because in\n\t// THREE.Curve, getLength() depends on getPoint() but in THREE.CurvePath\n\t// getPoint() depends on getLength\n\n\tgetLength() {\n\n\t\tconst lens = this.getCurveLengths();\n\t\treturn lens[ lens.length - 1 ];\n\n\t}\n\n\t// cacheLengths must be recalculated.\n\tupdateArcLengths() {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.cacheLengths = null;\n\t\tthis.getCurveLengths();\n\n\t}\n\n\t// Compute lengths and cache them\n\t// We cannot overwrite getLengths() because UtoT mapping uses it.\n\n\tgetCurveLengths() {\n\n\t\t// We use cache values if curves and cache array are same length\n\n\t\tif ( this.cacheLengths && this.cacheLengths.length === this.curves.length ) {\n\n\t\t\treturn this.cacheLengths;\n\n\t\t}\n\n\t\t// Get length of sub-curve\n\t\t// Push sums into cached array\n\n\t\tconst lengths = [];\n\t\tlet sums = 0;\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tsums += this.curves[ i ].getLength();\n\t\t\tlengths.push( sums );\n\n\t\t}\n\n\t\tthis.cacheLengths = lengths;\n\n\t\treturn lengths;\n\n\t}\n\n\tgetSpacedPoints( divisions = 40 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let i = 0; i <= divisions; i ++ ) {\n\n\t\t\tpoints.push( this.getPoint( i / divisions ) );\n\n\t\t}\n\n\t\tif ( this.autoClose ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tgetPoints( divisions = 12 ) {\n\n\t\tconst points = [];\n\t\tlet last;\n\n\t\tfor ( let i = 0, curves = this.curves; i < curves.length; i ++ ) {\n\n\t\t\tconst curve = curves[ i ];\n\t\t\tconst resolution = curve.isEllipseCurve ? divisions * 2\n\t\t\t\t: ( curve.isLineCurve || curve.isLineCurve3 ) ? 1\n\t\t\t\t\t: curve.isSplineCurve ? divisions * curve.points.length\n\t\t\t\t\t\t: divisions;\n\n\t\t\tconst pts = curve.getPoints( resolution );\n\n\t\t\tfor ( let j = 0; j < pts.length; j ++ ) {\n\n\t\t\t\tconst point = pts[ j ];\n\n\t\t\t\tif ( last && last.equals( point ) ) continue; // ensures no consecutive points are duplicates\n\n\t\t\t\tpoints.push( point );\n\t\t\t\tlast = point;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.autoClose && points.length > 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( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = source.curves.length; i < l; i ++ ) {\n\n\t\t\tconst 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() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.autoClose = this.autoClose;\n\t\tdata.curves = [];\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tconst 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( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.autoClose = json.autoClose;\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = json.curves.length; i < l; i ++ ) {\n\n\t\t\tconst 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\nclass Path extends CurvePath {\n\n\tconstructor( points ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Path';\n\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.setFromPoints( points );\n\n\t\t}\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.moveTo( points[ 0 ].x, points[ 0 ].y );\n\n\t\tfor ( let 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\treturn this;\n\n\t}\n\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\treturn this;\n\n\t}\n\n\tlineTo( x, y ) {\n\n\t\tconst 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\treturn this;\n\n\t}\n\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tconst 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\treturn this;\n\n\t}\n\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tconst 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\treturn this;\n\n\t}\n\n\tsplineThru( pts /*Array of Vector*/ ) {\n\n\t\tconst npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\tconst curve = new SplineCurve( npts );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\treturn this;\n\n\t}\n\n\tarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\tabsarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\tellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\treturn this;\n\n\t}\n\n\tabsellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst 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\tconst 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\tconst lastPoint = curve.getPoint( 1 );\n\t\tthis.currentPoint.copy( lastPoint );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.currentPoint.copy( source.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.currentPoint = this.currentPoint.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.currentPoint.fromArray( json.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LatheGeometry extends BufferGeometry {\n\n\tconstructor( points = [ new Vector2( 0, - 0.5 ), new Vector2( 0.5, 0 ), new Vector2( 0, 0.5 ) ], segments = 12, phiStart = 0, phiLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments );\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = clamp( phiLength, 0, Math.PI * 2 );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst uvs = [];\n\t\tconst initNormals = [];\n\t\tconst normals = [];\n\n\t\t// helper variables\n\n\t\tconst inverseSegments = 1.0 / segments;\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tconst normal = new Vector3();\n\t\tconst curNormal = new Vector3();\n\t\tconst prevNormal = new Vector3();\n\t\tlet dx = 0;\n\t\tlet dy = 0;\n\n\t\t// pre-compute normals for initial \"meridian\"\n\n\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\tswitch ( j ) {\n\n\t\t\t\tcase 0:\t\t\t\t// special handling for 1st vertex on path\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tprevNormal.copy( normal );\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ( points.length - 1 ):\t// special handling for last Vertex on path\n\n\t\t\t\t\tinitNormals.push( prevNormal.x, prevNormal.y, prevNormal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\t\t\t// default handling for all vertices in between\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tcurNormal.copy( normal );\n\n\t\t\t\t\tnormal.x += prevNormal.x;\n\t\t\t\t\tnormal.y += prevNormal.y;\n\t\t\t\t\tnormal.z += prevNormal.z;\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tprevNormal.copy( curNormal );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices, uvs and normals\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tconst sin = Math.sin( phi );\n\t\t\tconst cos = Math.cos( phi );\n\n\t\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// normal\n\n\t\t\t\tconst x = initNormals[ 3 * j + 0 ] * sin;\n\t\t\t\tconst y = initNormals[ 3 * j + 1 ];\n\t\t\t\tconst z = initNormals[ 3 * j + 0 ] * cos;\n\n\t\t\t\tnormals.push( x, y, z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tconst base = j + i * points.length;\n\n\t\t\t\tconst a = base;\n\t\t\t\tconst b = base + points.length;\n\t\t\t\tconst c = base + points.length + 1;\n\t\t\t\tconst d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( c, d, b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new LatheGeometry( data.points, data.segments, data.phiStart, data.phiLength );\n\n\t}\n\n}\n\nclass CapsuleGeometry extends LatheGeometry {\n\n\tconstructor( radius = 1, length = 1, capSegments = 4, radialSegments = 8 ) {\n\n\t\tconst path = new Path();\n\t\tpath.absarc( 0, - length / 2, radius, Math.PI * 1.5, 0 );\n\t\tpath.absarc( 0, length / 2, radius, 0, Math.PI * 0.5 );\n\n\t\tsuper( path.getPoints( capSegments ), radialSegments );\n\n\t\tthis.type = 'CapsuleGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tlength: length,\n\t\t\tcapSegments: capSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new CapsuleGeometry( data.radius, data.length, data.capSegments, data.radialSegments );\n\n\t}\n\n}\n\nclass CircleGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, segments = 32, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CircleGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tsegments = Math.max( 3, segments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( let s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tconst segment = thetaStart + s / segments * 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// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new CircleGeometry( data.radius, data.segments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass CylinderGeometry extends BufferGeometry {\n\n\tconstructor( radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CylinderGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tconst scope = this;\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet index = 0;\n\t\tconst indexArray = [];\n\t\tconst halfHeight = height / 2;\n\t\tlet groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tconst normal = new Vector3();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tconst slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tconst indexRow = [];\n\n\t\t\t\tconst v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tconst radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tconst u = x / radialSegments;\n\n\t\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( let y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tconst a = indexArray[ y ][ x ];\n\t\t\t\t\tconst b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tconst c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tconst d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// update group counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\t// save the index of the first center vertex\n\t\t\tconst centerIndexStart = index;\n\n\t\t\tconst uv = new Vector2();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tconst sign = ( top === true ) ? 1 : - 1;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( let x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\t\t\tconst centerIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tconst u = x / radialSegments;\n\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\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\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tconst c = centerIndexStart + x;\n\t\t\t\tconst i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new CylinderGeometry( data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass ConeGeometry extends CylinderGeometry {\n\n\tconstructor( radius = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper( 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new ConeGeometry( data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass PolyhedronGeometry extends BufferGeometry {\n\n\tconstructor( vertices = [], indices = [], radius = 1, detail = 0 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\t// default buffer data\n\n\t\tconst vertexBuffer = [];\n\t\tconst uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tapplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\n\t\tif ( detail === 0 ) {\n\n\t\t\tthis.computeVertexNormals(); // flat normals\n\n\t\t} else {\n\n\t\t\tthis.normalizeNormals(); // smooth normals\n\n\t\t}\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivision with the given detail value\n\n\t\t\tfor ( let i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tconst cols = detail + 1;\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tconst v = [];\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( let i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tconst aj = a.clone().lerp( c, i / cols );\n\t\t\t\tconst bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tconst rows = cols - i;\n\n\t\t\t\tfor ( let j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( let i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tconst k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\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\tfunction applyRadius( radius ) {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tconst u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tconst v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( let i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tconst x0 = uvBuffer[ i + 0 ];\n\t\t\t\tconst x1 = uvBuffer[ i + 2 ];\n\t\t\t\tconst x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tconst max = Math.max( x0, x1, x2 );\n\t\t\t\tconst min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tconst stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\tconst centroid = new Vector3();\n\n\t\t\tconst uvA = new Vector2();\n\t\t\tconst uvB = new Vector2();\n\t\t\tconst uvC = new Vector2();\n\n\t\t\tfor ( let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\t\tconst azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth( vector ) {\n\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new PolyhedronGeometry( data.vertices, data.indices, data.radius, data.details );\n\n\t}\n\n}\n\nclass DodecahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tconst r = 1 / t;\n\n\t\tconst vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t- 1, - 1, - 1,\t- 1, - 1, 1,\n\t\t\t- 1, 1, - 1, - 1, 1, 1,\n\t\t\t1, - 1, - 1, 1, - 1, 1,\n\t\t\t1, 1, - 1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t0, - r, - t, 0, - r, t,\n\t\t\t0, r, - t, 0, r, t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t- r, - t, 0, - r, t, 0,\n\t\t\tr, - t, 0, r, t, 0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t- t, 0, - r, t, 0, - r,\n\t\t\t- t, 0, r, t, 0, r\n\t\t];\n\n\t\tconst indices = [\n\t\t\t3, 11, 7, \t3, 7, 15, \t3, 15, 13,\n\t\t\t7, 19, 17, \t7, 17, 6, \t7, 6, 15,\n\t\t\t17, 4, 8, \t17, 8, 10, \t17, 10, 6,\n\t\t\t8, 0, 16, \t8, 16, 2, \t8, 2, 10,\n\t\t\t0, 12, 1, \t0, 1, 18, \t0, 18, 16,\n\t\t\t6, 10, 2, \t6, 2, 13, \t6, 13, 15,\n\t\t\t2, 16, 18, \t2, 18, 3, \t2, 3, 13,\n\t\t\t18, 1, 9, \t18, 9, 11, \t18, 11, 3,\n\t\t\t4, 14, 12, \t4, 12, 0, \t4, 0, 8,\n\t\t\t11, 9, 5, \t11, 5, 19, \t11, 19, 7,\n\t\t\t19, 5, 14, \t19, 14, 4, \t19, 4, 17,\n\t\t\t1, 12, 14, \t1, 14, 5, \t1, 5, 9\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new DodecahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nconst _v0 = /*@__PURE__*/ new Vector3();\nconst _v1$1 = /*@__PURE__*/ new Vector3();\nconst _normal = /*@__PURE__*/ new Vector3();\nconst _triangle = /*@__PURE__*/ new Triangle();\n\nclass EdgesGeometry extends BufferGeometry {\n\n\tconstructor( geometry = null, thresholdAngle = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'EdgesGeometry';\n\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry,\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\tconst precisionPoints = 4;\n\t\t\tconst precision = Math.pow( 10, precisionPoints );\n\t\t\tconst thresholdDot = Math.cos( DEG2RAD * thresholdAngle );\n\n\t\t\tconst indexAttr = geometry.getIndex();\n\t\t\tconst positionAttr = geometry.getAttribute( 'position' );\n\t\t\tconst indexCount = indexAttr ? indexAttr.count : positionAttr.count;\n\n\t\t\tconst indexArr = [ 0, 0, 0 ];\n\t\t\tconst vertKeys = [ 'a', 'b', 'c' ];\n\t\t\tconst hashes = new Array( 3 );\n\n\t\t\tconst edgeData = {};\n\t\t\tconst vertices = [];\n\t\t\tfor ( let i = 0; i < indexCount; i += 3 ) {\n\n\t\t\t\tif ( indexAttr ) {\n\n\t\t\t\t\tindexArr[ 0 ] = indexAttr.getX( i );\n\t\t\t\t\tindexArr[ 1 ] = indexAttr.getX( i + 1 );\n\t\t\t\t\tindexArr[ 2 ] = indexAttr.getX( i + 2 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindexArr[ 0 ] = i;\n\t\t\t\t\tindexArr[ 1 ] = i + 1;\n\t\t\t\t\tindexArr[ 2 ] = i + 2;\n\n\t\t\t\t}\n\n\t\t\t\tconst { a, b, c } = _triangle;\n\t\t\t\ta.fromBufferAttribute( positionAttr, indexArr[ 0 ] );\n\t\t\t\tb.fromBufferAttribute( positionAttr, indexArr[ 1 ] );\n\t\t\t\tc.fromBufferAttribute( positionAttr, indexArr[ 2 ] );\n\t\t\t\t_triangle.getNormal( _normal );\n\n\t\t\t\t// create hashes for the edge from the vertices\n\t\t\t\thashes[ 0 ] = `${ Math.round( a.x * precision ) },${ Math.round( a.y * precision ) },${ Math.round( a.z * precision ) }`;\n\t\t\t\thashes[ 1 ] = `${ Math.round( b.x * precision ) },${ Math.round( b.y * precision ) },${ Math.round( b.z * precision ) }`;\n\t\t\t\thashes[ 2 ] = `${ Math.round( c.x * precision ) },${ Math.round( c.y * precision ) },${ Math.round( c.z * precision ) }`;\n\n\t\t\t\t// skip degenerate triangles\n\t\t\t\tif ( hashes[ 0 ] === hashes[ 1 ] || hashes[ 1 ] === hashes[ 2 ] || hashes[ 2 ] === hashes[ 0 ] ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// iterate over every edge\n\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t// get the first and next vertex making up the edge\n\t\t\t\t\tconst jNext = ( j + 1 ) % 3;\n\t\t\t\t\tconst vecHash0 = hashes[ j ];\n\t\t\t\t\tconst vecHash1 = hashes[ jNext ];\n\t\t\t\t\tconst v0 = _triangle[ vertKeys[ j ] ];\n\t\t\t\t\tconst v1 = _triangle[ vertKeys[ jNext ] ];\n\n\t\t\t\t\tconst hash = `${ vecHash0 }_${ vecHash1 }`;\n\t\t\t\t\tconst reverseHash = `${ vecHash1 }_${ vecHash0 }`;\n\n\t\t\t\t\tif ( reverseHash in edgeData && edgeData[ reverseHash ] ) {\n\n\t\t\t\t\t\t// if we found a sibling edge add it into the vertex array if\n\t\t\t\t\t\t// it meets the angle threshold and delete the edge from the map.\n\t\t\t\t\t\tif ( _normal.dot( edgeData[ reverseHash ].normal ) <= thresholdDot ) {\n\n\t\t\t\t\t\t\tvertices.push( v0.x, v0.y, v0.z );\n\t\t\t\t\t\t\tvertices.push( v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tedgeData[ reverseHash ] = null;\n\n\t\t\t\t\t} else if ( ! ( hash in edgeData ) ) {\n\n\t\t\t\t\t\t// if we've already got an edge here then skip adding a new one\n\t\t\t\t\t\tedgeData[ hash ] = {\n\n\t\t\t\t\t\t\tindex0: indexArr[ j ],\n\t\t\t\t\t\t\tindex1: indexArr[ jNext ],\n\t\t\t\t\t\t\tnormal: _normal.clone(),\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// iterate over all remaining, unmatched edges and add them to the vertex array\n\t\t\tfor ( const key in edgeData ) {\n\n\t\t\t\tif ( edgeData[ key ] ) {\n\n\t\t\t\t\tconst { index0, index1 } = edgeData[ key ];\n\t\t\t\t\t_v0.fromBufferAttribute( positionAttr, index0 );\n\t\t\t\t\t_v1$1.fromBufferAttribute( positionAttr, index1 );\n\n\t\t\t\t\tvertices.push( _v0.x, _v0.y, _v0.z );\n\t\t\t\t\tvertices.push( _v1$1.x, _v1$1.y, _v1$1.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass Shape extends Path {\n\n\tconstructor( points ) {\n\n\t\tsuper( points );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.type = 'Shape';\n\n\t\tthis.holes = [];\n\n\t}\n\n\tgetPointsHoles( divisions ) {\n\n\t\tconst holesPts = [];\n\n\t\tfor ( let 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( 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( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = source.holes.length; i < l; i ++ ) {\n\n\t\t\tconst 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() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.holes = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tconst 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( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.uuid = json.uuid;\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = json.holes.length; i < l; i ++ ) {\n\n\t\t\tconst 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 * Port from https://github.com/mapbox/earcut (v2.2.4)\n */\n\nconst Earcut = {\n\n\ttriangulate: function ( data, holeIndices, dim = 2 ) {\n\n\t\tconst hasHoles = holeIndices && holeIndices.length;\n\t\tconst outerLen = hasHoles ? holeIndices[ 0 ] * dim : data.length;\n\t\tlet outerNode = linkedList( data, 0, outerLen, dim, true );\n\t\tconst triangles = [];\n\n\t\tif ( ! outerNode || outerNode.next === outerNode.prev ) return triangles;\n\n\t\tlet 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\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 ( let 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\t\t\tinvSize = Math.max( maxX - minX, maxY - minY );\n\t\t\tinvSize = invSize !== 0 ? 32767 / invSize : 0;\n\n\t\t}\n\n\t\tearcutLinked( outerNode, triangles, dim, minX, minY, invSize, 0 );\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\nfunction linkedList( data, start, end, dim, clockwise ) {\n\n\tlet 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\nfunction filterPoints( start, end ) {\n\n\tif ( ! start ) return start;\n\tif ( ! end ) end = start;\n\n\tlet p = start,\n\t\tagain;\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)\nfunction earcutLinked( ear, triangles, dim, minX, minY, invSize, pass ) {\n\n\tif ( ! ear ) return;\n\n\t// interlink polygon nodes in z-order\n\tif ( ! pass && invSize ) indexCurve( ear, minX, minY, invSize );\n\n\tlet stop = ear,\n\t\tprev, next;\n\n\t// iterate through ears, slicing them one by one\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 | 0 );\n\t\t\ttriangles.push( ear.i / dim | 0 );\n\t\t\ttriangles.push( next.i / dim | 0 );\n\n\t\t\tremoveNode( ear );\n\n\t\t\t// skipping the next vertex 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\t\tif ( ear === stop ) {\n\n\t\t\t// try filtering points and slicing again\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( filterPoints( ear ), triangles, dim );\n\t\t\t\tearcutLinked( ear, triangles, dim, minX, minY, invSize, 2 );\n\n\t\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\nfunction isEar( ear ) {\n\n\tconst 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\tconst ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n\t// triangle bbox; min & max are calculated like this for speed\n\tconst x0 = ax < bx ? ( ax < cx ? ax : cx ) : ( bx < cx ? bx : cx ),\n\t\ty0 = ay < by ? ( ay < cy ? ay : cy ) : ( by < cy ? by : cy ),\n\t\tx1 = ax > bx ? ( ax > cx ? ax : cx ) : ( bx > cx ? bx : cx ),\n\t\ty1 = ay > by ? ( ay > cy ? ay : cy ) : ( by > cy ? by : cy );\n\n\tlet p = c.next;\n\twhile ( p !== a ) {\n\n\t\tif ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) &&\n\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.next;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction isEarHashed( ear, minX, minY, invSize ) {\n\n\tconst 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\tconst ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n\t// triangle bbox; min & max are calculated like this for speed\n\tconst x0 = ax < bx ? ( ax < cx ? ax : cx ) : ( bx < cx ? bx : cx ),\n\t\ty0 = ay < by ? ( ay < cy ? ay : cy ) : ( by < cy ? by : cy ),\n\t\tx1 = ax > bx ? ( ax > cx ? ax : cx ) : ( bx > cx ? bx : cx ),\n\t\ty1 = ay > by ? ( ay > cy ? ay : cy ) : ( by > cy ? by : cy );\n\n\t// z-order range for the current triangle bbox;\n\tconst minZ = zOrder( x0, y0, minX, minY, invSize ),\n\t\tmaxZ = zOrder( x1, y1, minX, minY, invSize );\n\n\tlet p = ear.prevZ,\n\t\tn = ear.nextZ;\n\n\t// look for points inside the triangle in both directions\n\twhile ( p && p.z >= minZ && n && n.z <= maxZ ) {\n\n\t\tif ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) && area( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t\tif ( n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, n.x, n.y ) && area( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\t// look for remaining points in decreasing z-order\n\twhile ( p && p.z >= minZ ) {\n\n\t\tif ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) && area( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t}\n\n\t// look for remaining points in increasing z-order\n\twhile ( n && n.z <= maxZ ) {\n\n\t\tif ( n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, n.x, n.y ) && area( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\treturn true;\n\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections( start, triangles, dim ) {\n\n\tlet p = start;\n\tdo {\n\n\t\tconst a = p.prev,\n\t\t\tb = 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 | 0 );\n\t\t\ttriangles.push( p.i / dim | 0 );\n\t\t\ttriangles.push( b.i / dim | 0 );\n\n\t\t\t// remove two nodes involved\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 filterPoints( p );\n\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut( start, triangles, dim, minX, minY, invSize ) {\n\n\t// look for a valid diagonal that divides the polygon into two\n\tlet a = start;\n\tdo {\n\n\t\tlet b = a.next.next;\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\t\t\t\tlet c = splitPolygon( a, b );\n\n\t\t\t\t// filter colinear points around the cuts\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\t\t\t\tearcutLinked( a, triangles, dim, minX, minY, invSize, 0 );\n\t\t\t\tearcutLinked( c, triangles, dim, minX, minY, invSize, 0 );\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\nfunction eliminateHoles( data, holeIndices, outerNode, dim ) {\n\n\tconst queue = [];\n\tlet 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\tfor ( i = 0; i < queue.length; i ++ ) {\n\n\t\touterNode = eliminateHole( queue[ i ], outerNode );\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 link it\nfunction eliminateHole( hole, outerNode ) {\n\n\tconst bridge = findHoleBridge( hole, outerNode );\n\tif ( ! bridge ) {\n\n\t\treturn outerNode;\n\n\t}\n\n\tconst bridgeReverse = splitPolygon( bridge, hole );\n\n\t// filter collinear points around the cuts\n\tfilterPoints( bridgeReverse, bridgeReverse.next );\n\treturn filterPoints( bridge, bridge.next );\n\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge( hole, outerNode ) {\n\n\tlet p = outerNode,\n\t\tqx = - Infinity,\n\t\tm;\n\n\tconst hx = hole.x, hy = hole.y;\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\tdo {\n\n\t\tif ( hy <= p.y && hy >= p.next.y && p.next.y !== p.y ) {\n\n\t\t\tconst x = p.x + ( hy - p.y ) * ( p.next.x - p.x ) / ( p.next.y - p.y );\n\t\t\tif ( x <= hx && x > qx ) {\n\n\t\t\t\tqx = x;\n\t\t\t\tm = p.x < p.next.x ? p : p.next;\n\t\t\t\tif ( x === hx ) return m; // hole touches outer segment; pick leftmost endpoint\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\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\tconst stop = m,\n\t\tmx = m.x,\n\t\tmy = m.y;\n\tlet tanMin = Infinity, tan;\n\n\tp = m;\n\n\tdo {\n\n\t\tif ( hx >= p.x && p.x >= mx && hx !== p.x &&\n\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 ( locallyInside( p, hole ) && ( tan < tanMin || ( tan === tanMin && ( p.x > m.x || ( p.x === m.x && sectorContainsSector( m, p ) ) ) ) ) ) {\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} while ( p !== stop );\n\n\treturn m;\n\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector( m, p ) {\n\n\treturn area( m.prev, m, p.prev ) < 0 && area( p.next, m, m.next ) < 0;\n\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve( start, minX, minY, invSize ) {\n\n\tlet p = start;\n\tdo {\n\n\t\tif ( p.z === 0 ) 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\nfunction sortLinked( list ) {\n\n\tlet i, p, q, e, tail, numMerges, pSize, qSize,\n\t\tinSize = 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\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\nfunction zOrder( x, y, minX, minY, invSize ) {\n\n\t// coords are transformed into non-negative 15-bit integer range\n\tx = ( x - minX ) * invSize | 0;\n\ty = ( y - minY ) * invSize | 0;\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\nfunction getLeftmost( start ) {\n\n\tlet p = start,\n\t\tleftmost = start;\n\tdo {\n\n\t\tif ( p.x < leftmost.x || ( p.x === leftmost.x && p.y < leftmost.y ) ) 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\nfunction pointInTriangle( ax, ay, bx, by, cx, cy, px, py ) {\n\n\treturn ( cx - px ) * ( ay - py ) >= ( ax - px ) * ( cy - py ) &&\n ( ax - px ) * ( by - py ) >= ( bx - px ) * ( ay - py ) &&\n ( bx - px ) * ( cy - py ) >= ( cx - px ) * ( by - py );\n\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal( a, b ) {\n\n\treturn a.next.i !== b.i && a.prev.i !== b.i && ! intersectsPolygon( a, b ) && // dones't intersect other edges\n ( locallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b ) && // locally visible\n ( area( a.prev, a, b.prev ) || area( a, b.prev, b ) ) || // does not create opposite-facing sectors\n equals( a, b ) && area( a.prev, a, a.next ) > 0 && area( b.prev, b, b.next ) > 0 ); // special zero-length case\n\n}\n\n// signed area of a triangle\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\nfunction equals( p1, p2 ) {\n\n\treturn p1.x === p2.x && p1.y === p2.y;\n\n}\n\n// check if two segments intersect\nfunction intersects( p1, q1, p2, q2 ) {\n\n\tconst o1 = sign( area( p1, q1, p2 ) );\n\tconst o2 = sign( area( p1, q1, q2 ) );\n\tconst o3 = sign( area( p2, q2, p1 ) );\n\tconst o4 = sign( area( p2, q2, q1 ) );\n\n\tif ( o1 !== o2 && o3 !== o4 ) return true; // general case\n\n\tif ( o1 === 0 && onSegment( p1, p2, q1 ) ) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n\tif ( o2 === 0 && onSegment( p1, q2, q1 ) ) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n\tif ( o3 === 0 && onSegment( p2, p1, q2 ) ) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n\tif ( o4 === 0 && onSegment( p2, q1, q2 ) ) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n\treturn false;\n\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment( p, q, r ) {\n\n\treturn q.x <= Math.max( p.x, r.x ) && q.x >= Math.min( p.x, r.x ) && q.y <= Math.max( p.y, r.y ) && q.y >= Math.min( p.y, r.y );\n\n}\n\nfunction sign( num ) {\n\n\treturn num > 0 ? 1 : num < 0 ? - 1 : 0;\n\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon( a, b ) {\n\n\tlet p = a;\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\tintersects( p, p.next, a, b ) ) return true;\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\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\nfunction middleInside( a, b ) {\n\n\tlet p = a,\n\t\tinside = false;\n\tconst px = ( a.x + b.x ) / 2,\n\t\tpy = ( a.y + b.y ) / 2;\n\tdo {\n\n\t\tif ( ( ( p.y > py ) !== ( p.next.y > py ) ) && p.next.y !== p.y &&\n\t\t\t( px < ( p.next.x - p.x ) * ( py - p.y ) / ( p.next.y - p.y ) + p.x ) )\n\t\t\tinside = ! inside;\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\nfunction splitPolygon( a, b ) {\n\n\tconst 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)\nfunction insertNode( i, x, y, last ) {\n\n\tconst 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// vertex 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 vertex nodes in a polygon ring\n\tthis.prev = null;\n\tthis.next = null;\n\n\t// z-order curve value\n\tthis.z = 0;\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\tlet sum = 0;\n\tfor ( let 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\nclass ShapeUtils {\n\n\t// calculate area of the contour polygon\n\n\tstatic area( contour ) {\n\n\t\tconst n = contour.length;\n\t\tlet a = 0.0;\n\n\t\tfor ( let 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\tstatic isClockWise( pts ) {\n\n\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t}\n\n\tstatic triangulateShape( contour, holes ) {\n\n\t\tconst vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]\n\t\tconst holeIndices = []; // array of hole indices\n\t\tconst 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\tlet holeIndex = contour.length;\n\n\t\tholes.forEach( removeDupEndPts );\n\n\t\tfor ( let 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\tconst triangles = Earcut.triangulate( vertices, holeIndices );\n\n\t\t//\n\n\t\tfor ( let 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\tconst 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 ( let 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 * Creates extruded geometry from a path shape.\n *\n * parameters = {\n *\n * curveSegments: <int>, // number of points on the curves\n * steps: <int>, // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n * depth: <float>, // Depth to extrude the shape\n *\n * bevelEnabled: <bool>, // turn on bevel\n * bevelThickness: <float>, // how deep into the original shape bevel goes\n * bevelSize: <float>, // how far from shape outline (including bevelOffset) is bevel\n * bevelOffset: <float>, // how far from shape outline does bevel start\n * bevelSegments: <int>, // number of bevel layers\n *\n * extrudePath: <THREE.Curve> // curve to extrude shape along\n *\n * UVGenerator: <Object> // object that provides UV generator functions\n *\n * }\n */\n\n\nclass ExtrudeGeometry extends BufferGeometry {\n\n\tconstructor( shapes = new Shape( [ new Vector2( 0.5, 0.5 ), new Vector2( - 0.5, 0.5 ), new Vector2( - 0.5, - 0.5 ), new Vector2( 0.5, - 0.5 ) ] ), options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\toptions: options\n\t\t};\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tconst scope = this;\n\n\t\tconst verticesArray = [];\n\t\tconst uvArray = [];\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\t\t\taddShape( shape );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );\n\n\t\tthis.computeVertexNormals();\n\n\t\t// functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst placeholder = [];\n\n\t\t\t// options\n\n\t\t\tconst curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\t\t\tconst steps = options.steps !== undefined ? options.steps : 1;\n\t\t\tconst depth = options.depth !== undefined ? options.depth : 1;\n\n\t\t\tlet bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;\n\t\t\tlet bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 0.2;\n\t\t\tlet bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 0.1;\n\t\t\tlet bevelOffset = options.bevelOffset !== undefined ? options.bevelOffset : 0;\n\t\t\tlet bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\t\tconst extrudePath = options.extrudePath;\n\n\t\t\tconst uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;\n\n\t\t\t//\n\n\t\t\tlet extrudePts, extrudeByPath = false;\n\t\t\tlet splineTube, binormal, normal, position2;\n\n\t\t\tif ( extrudePath ) {\n\n\t\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\t\textrudeByPath = true;\n\t\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t\t// SETUP TNB variables\n\n\t\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\t\tsplineTube = extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\t\tbinormal = new Vector3();\n\t\t\t\tnormal = new Vector3();\n\t\t\t\tposition2 = new Vector3();\n\n\t\t\t}\n\n\t\t\t// Safeguards if bevels are not enabled\n\n\t\t\tif ( ! bevelEnabled ) {\n\n\t\t\t\tbevelSegments = 0;\n\t\t\t\tbevelThickness = 0;\n\t\t\t\tbevelSize = 0;\n\t\t\t\tbevelOffset = 0;\n\n\t\t\t}\n\n\t\t\t// Variables initialization\n\n\t\t\tconst shapePoints = shape.extractPoints( curveSegments );\n\n\t\t\tlet vertices = shapePoints.shape;\n\t\t\tconst holes = shapePoints.holes;\n\n\t\t\tconst reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\t\tif ( reverse ) {\n\n\t\t\t\tvertices = vertices.reverse();\n\n\t\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t\t/* Vertices */\n\n\t\t\tconst contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\tvertices = vertices.concat( ahole );\n\n\t\t\t}\n\n\n\t\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\t\tif ( ! vec ) console.error( 'THREE.ExtrudeGeometry: vec does not exist' );\n\n\t\t\t\treturn pt.clone().addScaledVector( vec, size );\n\n\t\t\t}\n\n\t\t\tconst vlen = vertices.length, flen = faces.length;\n\n\n\t\t\t// Find directions for point movement\n\n\n\t\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t\t//\n\t\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\t\tlet v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt\n\n\t\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\t\tconst v_prev_x = inPt.x - inPrev.x,\n\t\t\t\t\tv_prev_y = inPt.y - inPrev.y;\n\t\t\t\tconst v_next_x = inNext.x - inPt.x,\n\t\t\t\t\tv_next_y = inNext.y - inPt.y;\n\n\t\t\t\tconst v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t\t// check for collinear edges\n\t\t\t\tconst collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not collinear\n\n\t\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\t\tconst v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\t\tconst v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\t\tconst ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\t\tconst ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\t\tconst ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\t\tconst ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\t\tconst sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t\t( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t\t// but prevent crazy spikes\n\t\t\t\t\tconst v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\t\treturn new Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\t\tlet direction_eq = false; // assumes: opposite\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 ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\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\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t\t}\n\n\n\t\t\tconst contourMovements = [];\n\n\t\t\tfor ( let i = 0, il = contour.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\t// console.log('i,j,k', i, j , k)\n\n\t\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t\t}\n\n\t\t\tconst holesMovements = [];\n\t\t\tlet oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\toneHoleMovements = [];\n\n\t\t\t\tfor ( let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t\t// (j)---(i)---(k)\n\t\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t\t}\n\n\t\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t\t}\n\n\n\t\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\t\tfor ( let b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ 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\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst bs = bevelSize + bevelOffset;\n\n\t\t\t// Back facing vertices\n\n\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tconst vert = 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, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ 0 ] ).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\t// Add stepped vertices...\n\t\t\t// Including front facing vertices\n\n\t\t\tfor ( let s = 1; s <= steps; s ++ ) {\n\n\t\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, depth / steps * s );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// Add bevel segments planes\n\n\t\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\t\tfor ( let b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t\t\t} else {\n\n\t\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\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t/* Faces */\n\n\t\t\t// Top and bottom faces\n\n\t\t\tbuildLidFaces();\n\n\t\t\t// Sides faces\n\n\t\t\tbuildSideFaces();\n\n\n\t\t\t///// Internal functions\n\n\t\t\tfunction buildLidFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\n\t\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\t\tlet layer = 0; // steps + 1\n\t\t\t\t\tlet offset = vlen * layer;\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 0 );\n\n\t\t\t}\n\n\t\t\t// Create faces for the z-sides of the shape\n\n\t\t\tfunction buildSideFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\t\t\t\tlet layeroffset = 0;\n\t\t\t\tsidewalls( contour, layeroffset );\n\t\t\t\tlayeroffset += contour.length;\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t\t//, true\n\t\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t\t}\n\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 1 );\n\n\n\t\t\t}\n\n\t\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\t\tlet i = contour.length;\n\n\t\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\t\tconst j = i;\n\t\t\t\t\tlet k = i - 1;\n\t\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\t\tfor ( let s = 0, sl = ( steps + bevelSegments * 2 ); s < sl; s ++ ) {\n\n\t\t\t\t\t\tconst slen1 = vlen * s;\n\t\t\t\t\t\tconst slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\t\tconst a = layeroffset + j + slen1,\n\t\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\t\tf4( a, b, c, d );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction v( x, y, z ) {\n\n\t\t\t\tplaceholder.push( x );\n\t\t\t\tplaceholder.push( y );\n\t\t\t\tplaceholder.push( z );\n\n\t\t\t}\n\n\n\t\t\tfunction f3( a, b, c ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\n\t\t\t}\n\n\t\t\tfunction f4( a, b, c, d ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( d );\n\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\t\t\t\taddVertex( d );\n\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t}\n\n\t\t\tfunction addVertex( index ) {\n\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 0 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 1 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 2 ] );\n\n\t\t\t}\n\n\n\t\t\tfunction addUV( vector2 ) {\n\n\t\t\t\tuvArray.push( vector2.x );\n\t\t\t\tuvArray.push( vector2.y );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\t\tconst options = this.parameters.options;\n\n\t\treturn toJSON$1( shapes, options, data );\n\n\t}\n\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\tconst extrudePath = data.options.extrudePath;\n\n\t\tif ( extrudePath !== undefined ) {\n\n\t\t\tdata.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath );\n\n\t\t}\n\n\t\treturn new ExtrudeGeometry( geometryShapes, data.options );\n\n\t}\n\n}\n\nconst WorldUVGenerator = {\n\n\tgenerateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst 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\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst a_z = vertices[ indexA * 3 + 2 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst b_z = vertices[ indexB * 3 + 2 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\t\tconst c_z = vertices[ indexC * 3 + 2 ];\n\t\tconst d_x = vertices[ indexD * 3 ];\n\t\tconst d_y = vertices[ indexD * 3 + 1 ];\n\t\tconst d_z = vertices[ indexD * 3 + 2 ];\n\n\t\tif ( Math.abs( a_y - b_y ) < Math.abs( a_x - b_x ) ) {\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\nfunction toJSON$1( shapes, options, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst 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\tdata.options = Object.assign( {}, options );\n\n\tif ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON();\n\n\treturn data;\n\n}\n\nclass IcosahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tconst vertices = [\n\t\t\t- 1, t, 0, \t1, t, 0, \t- 1, - t, 0, \t1, - t, 0,\n\t\t\t0, - 1, t, \t0, 1, t,\t0, - 1, - t, \t0, 1, - t,\n\t\t\tt, 0, - 1, \tt, 0, 1, \t- t, 0, - 1, \t- t, 0, 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 11, 5, \t0, 5, 1, \t0, 1, 7, \t0, 7, 10, \t0, 10, 11,\n\t\t\t1, 5, 9, \t5, 11, 4,\t11, 10, 2,\t10, 7, 6,\t7, 1, 8,\n\t\t\t3, 9, 4, \t3, 4, 2,\t3, 2, 6,\t3, 6, 8,\t3, 8, 9,\n\t\t\t4, 9, 5, \t2, 4, 11,\t6, 2, 10,\t8, 6, 7,\t9, 8, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new IcosahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nclass OctahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 0, 0, \t- 1, 0, 0,\t0, 1, 0,\n\t\t\t0, - 1, 0, \t0, 0, 1,\t0, 0, - 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 2, 4,\t0, 4, 3,\t0, 3, 5,\n\t\t\t0, 5, 2,\t1, 2, 5,\t1, 5, 3,\n\t\t\t1, 3, 4,\t1, 4, 2\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new OctahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nclass RingGeometry extends BufferGeometry {\n\n\tconstructor( innerRadius = 0.5, outerRadius = 1, thetaSegments = 32, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'RingGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthetaSegments = Math.max( 3, thetaSegments );\n\t\tphiSegments = Math.max( 1, phiSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// some helper variables\n\n\t\tlet radius = innerRadius;\n\t\tconst radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tconst segment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tconst thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( let i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tconst segment = i + thetaSegmentLevel;\n\n\t\t\t\tconst a = segment;\n\t\t\t\tconst b = segment + thetaSegments + 1;\n\t\t\t\tconst c = segment + thetaSegments + 2;\n\t\t\t\tconst d = segment + 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}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new RingGeometry( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass ShapeGeometry extends BufferGeometry {\n\n\tconstructor( shapes = new Shape( [ new Vector2( 0, 0.5 ), new Vector2( - 0.5, - 0.5 ), new Vector2( 0.5, - 0.5 ) ] ), curveSegments = 12 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet groupStart = 0;\n\t\tlet groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst indexOffset = vertices.length / 3;\n\t\t\tconst points = shape.extractPoints( curveSegments );\n\n\t\t\tlet shapeVertices = points.shape;\n\t\t\tconst shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = 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\tconst faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( let i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tconst vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tconst face = faces[ i ];\n\n\t\t\t\tconst a = face[ 0 ] + indexOffset;\n\t\t\t\tconst b = face[ 1 ] + indexOffset;\n\t\t\t\tconst c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\n\t\treturn toJSON( shapes, data );\n\n\t}\n\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\treturn new ShapeGeometry( geometryShapes, data.curveSegments );\n\n\t}\n\n}\n\nfunction toJSON( shapes, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst 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\nclass SphereGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, widthSegments = 32, heightSegments = 16, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'SphereGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) );\n\n\t\tconst thetaEnd = Math.min( thetaStart + thetaLength, Math.PI );\n\n\t\tlet index = 0;\n\t\tconst grid = [];\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tconst verticesRow = [];\n\n\t\t\tconst v = iy / heightSegments;\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy === 0 && thetaStart === 0 ) {\n\n\t\t\t\tuOffset = 0.5 / widthSegments;\n\n\t\t\t} else if ( iy === heightSegments && thetaEnd === Math.PI ) {\n\n\t\t\t\tuOffset = - 0.5 / widthSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\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.copy( vertex ).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 + uOffset, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tconst a = grid[ iy ][ ix + 1 ];\n\t\t\t\tconst b = grid[ iy ][ ix ];\n\t\t\t\tconst c = grid[ iy + 1 ][ ix ];\n\t\t\t\tconst d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new SphereGeometry( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass TetrahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 1, 1, \t- 1, - 1, 1, \t- 1, 1, - 1, \t1, - 1, - 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t2, 1, 0, \t0, 3, 2,\t1, 3, 0,\t2, 3, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new TetrahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nclass TorusGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\ttubularSegments = Math.floor( tubularSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst center = new Vector3();\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tconst u = i / tubularSegments * arc;\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\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( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tconst b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tconst c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tconst d = ( tubularSegments + 1 ) * j + 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\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusGeometry( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc );\n\n\t}\n\n}\n\nclass TorusKnotGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\ttubularSegments = Math.floor( tubularSegments );\n\t\tradialSegments = Math.floor( radialSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tconst P1 = new Vector3();\n\t\tconst P2 = new Vector3();\n\n\t\tconst B = new Vector3();\n\t\tconst T = new Vector3();\n\t\tconst N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segment\n\n\t\t\tconst u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( let j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\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\t\tconst v = j / radialSegments * Math.PI * 2;\n\t\t\t\tconst cx = - tube * Math.cos( v );\n\t\t\t\tconst cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectors, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\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\t\tnormal.subVectors( vertex, P1 ).normalize();\n\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( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tconst 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\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\t\tconst cu = Math.cos( u );\n\t\t\tconst su = Math.sin( u );\n\t\t\tconst quOverP = q / p * u;\n\t\t\tconst cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusKnotGeometry( data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q );\n\n\t}\n\n}\n\nclass TubeGeometry extends BufferGeometry {\n\n\tconstructor( path = new QuadraticBezierCurve3( new Vector3( - 1, - 1, 0 ), new Vector3( - 1, 1, 0 ), new Vector3( 1, 1, 0 ) ), tubularSegments = 64, radius = 1, radialSegments = 8, closed = false ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TubeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tconst frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tlet P = new Vector3();\n\n\t\t// buffer\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\t\tconst indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( let i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tP = path.getPointAt( i / tubularSegments, P );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tconst N = frames.normals[ i ];\n\t\t\tconst B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tconst sin = Math.sin( v );\n\t\t\t\tconst cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.path = this.parameters.path.toJSON();\n\n\t\treturn data;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\t// This only works for built-in curves (e.g. CatmullRomCurve3).\n\t\t// User defined curves or instances of CurvePath will not be deserialized.\n\t\treturn new TubeGeometry(\n\t\t\tnew Curves[ data.path.type ]().fromJSON( data.path ),\n\t\t\tdata.tubularSegments,\n\t\t\tdata.radius,\n\t\t\tdata.radialSegments,\n\t\t\tdata.closed\n\t\t);\n\n\t}\n\n}\n\nclass WireframeGeometry extends BufferGeometry {\n\n\tconstructor( geometry = null ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'WireframeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\t// buffer\n\n\t\t\tconst vertices = [];\n\t\t\tconst edges = new Set();\n\n\t\t\t// helper variables\n\n\t\t\tconst start = new Vector3();\n\t\t\tconst end = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\t\t\t\tconst indices = geometry.index;\n\t\t\t\tlet groups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgroups = [ { start: 0, count: indices.count, materialIndex: 0 } ];\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\t\tfor ( let o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tconst group = groups[ o ];\n\n\t\t\t\t\tconst groupStart = group.start;\n\t\t\t\t\tconst groupCount = group.count;\n\n\t\t\t\t\tfor ( let i = groupStart, l = ( groupStart + groupCount ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tconst index1 = indices.getX( i + j );\n\t\t\t\t\t\t\tconst index2 = indices.getX( i + ( j + 1 ) % 3 );\n\n\t\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\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} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\n\t\t\t\tfor ( let i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\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\t\tconst index1 = 3 * i + j;\n\t\t\t\t\t\tconst index2 = 3 * i + ( ( j + 1 ) % 3 );\n\n\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\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// build geometry\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction isUniqueEdge( start, end, edges ) {\n\n\tconst hash1 = `${start.x},${start.y},${start.z}-${end.x},${end.y},${end.z}`;\n\tconst hash2 = `${end.x},${end.y},${end.z}-${start.x},${start.y},${start.z}`; // coincident edge\n\n\tif ( edges.has( hash1 ) === true || edges.has( hash2 ) === true ) {\n\n\t\treturn false;\n\n\t} else {\n\n\t\tedges.add( hash1 );\n\t\tedges.add( hash2 );\n\t\treturn true;\n\n\t}\n\n}\n\nvar Geometries = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tBoxGeometry: BoxGeometry,\n\tCapsuleGeometry: CapsuleGeometry,\n\tCircleGeometry: CircleGeometry,\n\tConeGeometry: ConeGeometry,\n\tCylinderGeometry: CylinderGeometry,\n\tDodecahedronGeometry: DodecahedronGeometry,\n\tEdgesGeometry: EdgesGeometry,\n\tExtrudeGeometry: ExtrudeGeometry,\n\tIcosahedronGeometry: IcosahedronGeometry,\n\tLatheGeometry: LatheGeometry,\n\tOctahedronGeometry: OctahedronGeometry,\n\tPlaneGeometry: PlaneGeometry,\n\tPolyhedronGeometry: PolyhedronGeometry,\n\tRingGeometry: RingGeometry,\n\tShapeGeometry: ShapeGeometry,\n\tSphereGeometry: SphereGeometry,\n\tTetrahedronGeometry: TetrahedronGeometry,\n\tTorusGeometry: TorusGeometry,\n\tTorusKnotGeometry: TorusKnotGeometry,\n\tTubeGeometry: TubeGeometry,\n\tWireframeGeometry: WireframeGeometry\n});\n\nclass ShadowMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isShadowMaterial = true;\n\n\t\tthis.type = 'ShadowMaterial';\n\n\t\tthis.color = new Color( 0x000000 );\n\t\tthis.transparent = true;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass RawShaderMaterial extends ShaderMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper( parameters );\n\n\t\tthis.isRawShaderMaterial = true;\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n}\n\nclass MeshStandardMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshStandardMaterial = true;\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.type = 'MeshStandardMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.roughness = 1.0;\n\t\tthis.metalness = 0.0;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.roughnessMap = null;\n\n\t\tthis.metalnessMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.envMapIntensity = 1.0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.color.copy( source.color );\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.roughnessMap = source.roughnessMap;\n\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshPhysicalMaterial extends MeshStandardMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshPhysicalMaterial = true;\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\tthis.anisotropyRotation = 0;\n\t\tthis.anisotropyMap = null;\n\n\t\tthis.clearcoatMap = null;\n\t\tthis.clearcoatRoughness = 0.0;\n\t\tthis.clearcoatRoughnessMap = null;\n\t\tthis.clearcoatNormalScale = new Vector2( 1, 1 );\n\t\tthis.clearcoatNormalMap = null;\n\n\t\tthis.ior = 1.5;\n\n\t\tObject.defineProperty( this, 'reflectivity', {\n\t\t\tget: function () {\n\n\t\t\t\treturn ( clamp( 2.5 * ( this.ior - 1 ) / ( this.ior + 1 ), 0, 1 ) );\n\n\t\t\t},\n\t\t\tset: function ( reflectivity ) {\n\n\t\t\t\tthis.ior = ( 1 + 0.4 * reflectivity ) / ( 1 - 0.4 * reflectivity );\n\n\t\t\t}\n\t\t} );\n\n\t\tthis.iridescenceMap = null;\n\t\tthis.iridescenceIOR = 1.3;\n\t\tthis.iridescenceThicknessRange = [ 100, 400 ];\n\t\tthis.iridescenceThicknessMap = null;\n\n\t\tthis.sheenColor = new Color( 0x000000 );\n\t\tthis.sheenColorMap = null;\n\t\tthis.sheenRoughness = 1.0;\n\t\tthis.sheenRoughnessMap = null;\n\n\t\tthis.transmissionMap = null;\n\n\t\tthis.thickness = 0;\n\t\tthis.thicknessMap = null;\n\t\tthis.attenuationDistance = Infinity;\n\t\tthis.attenuationColor = new Color( 1, 1, 1 );\n\n\t\tthis.specularIntensity = 1.0;\n\t\tthis.specularIntensityMap = null;\n\t\tthis.specularColor = new Color( 1, 1, 1 );\n\t\tthis.specularColorMap = null;\n\n\t\tthis._anisotropy = 0;\n\t\tthis._clearcoat = 0;\n\t\tthis._iridescence = 0;\n\t\tthis._sheen = 0.0;\n\t\tthis._transmission = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tget anisotropy() {\n\n\t\treturn this._anisotropy;\n\n\t}\n\n\tset anisotropy( value ) {\n\n\t\tif ( this._anisotropy > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._anisotropy = value;\n\n\t}\n\n\tget clearcoat() {\n\n\t\treturn this._clearcoat;\n\n\t}\n\n\tset clearcoat( value ) {\n\n\t\tif ( this._clearcoat > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._clearcoat = value;\n\n\t}\n\n\tget iridescence() {\n\n\t\treturn this._iridescence;\n\n\t}\n\n\tset iridescence( value ) {\n\n\t\tif ( this._iridescence > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._iridescence = value;\n\n\t}\n\n\tget sheen() {\n\n\t\treturn this._sheen;\n\n\t}\n\n\tset sheen( value ) {\n\n\t\tif ( this._sheen > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._sheen = value;\n\n\t}\n\n\tget transmission() {\n\n\t\treturn this._transmission;\n\n\t}\n\n\tset transmission( value ) {\n\n\t\tif ( this._transmission > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._transmission = value;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.anisotropy = source.anisotropy;\n\t\tthis.anisotropyRotation = source.anisotropyRotation;\n\t\tthis.anisotropyMap = source.anisotropyMap;\n\n\t\tthis.clearcoat = source.clearcoat;\n\t\tthis.clearcoatMap = source.clearcoatMap;\n\t\tthis.clearcoatRoughness = source.clearcoatRoughness;\n\t\tthis.clearcoatRoughnessMap = source.clearcoatRoughnessMap;\n\t\tthis.clearcoatNormalMap = source.clearcoatNormalMap;\n\t\tthis.clearcoatNormalScale.copy( source.clearcoatNormalScale );\n\n\t\tthis.ior = source.ior;\n\n\t\tthis.iridescence = source.iridescence;\n\t\tthis.iridescenceMap = source.iridescenceMap;\n\t\tthis.iridescenceIOR = source.iridescenceIOR;\n\t\tthis.iridescenceThicknessRange = [ ...source.iridescenceThicknessRange ];\n\t\tthis.iridescenceThicknessMap = source.iridescenceThicknessMap;\n\n\t\tthis.sheen = source.sheen;\n\t\tthis.sheenColor.copy( source.sheenColor );\n\t\tthis.sheenColorMap = source.sheenColorMap;\n\t\tthis.sheenRoughness = source.sheenRoughness;\n\t\tthis.sheenRoughnessMap = source.sheenRoughnessMap;\n\n\t\tthis.transmission = source.transmission;\n\t\tthis.transmissionMap = source.transmissionMap;\n\n\t\tthis.thickness = source.thickness;\n\t\tthis.thicknessMap = source.thicknessMap;\n\t\tthis.attenuationDistance = source.attenuationDistance;\n\t\tthis.attenuationColor.copy( source.attenuationColor );\n\n\t\tthis.specularIntensity = source.specularIntensity;\n\t\tthis.specularIntensityMap = source.specularIntensityMap;\n\t\tthis.specularColor.copy( source.specularColor );\n\t\tthis.specularColorMap = source.specularColorMap;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshPhongMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshPhongMaterial = true;\n\n\t\tthis.type = 'MeshPhongMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.specular = new Color( 0x111111 );\n\t\tthis.shininess = 30;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.specular.copy( source.specular );\n\t\tthis.shininess = source.shininess;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshToonMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshToonMaterial = true;\n\n\t\tthis.defines = { 'TOON': '' };\n\n\t\tthis.type = 'MeshToonMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\t\tthis.gradientMap = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\t\tthis.gradientMap = source.gradientMap;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshNormalMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshNormalMaterial = true;\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.flatShading = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshLambertMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshLambertMaterial = true;\n\n\t\tthis.type = 'MeshLambertMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshMatcapMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshMatcapMaterial = true;\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.type = 'MeshMatcapMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\tthis.matcap = null;\n\n\t\tthis.map = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.matcap = source.matcap;\n\n\t\tthis.map = source.map;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LineDashedMaterial extends LineBasicMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isLineDashedMaterial = true;\n\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\tthis.scale = 1;\n\t\tthis.dashSize = 3;\n\t\tthis.gapSize = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.scale = source.scale;\n\t\tthis.dashSize = source.dashSize;\n\t\tthis.gapSize = source.gapSize;\n\n\t\treturn this;\n\n\t}\n\n}\n\n// converts an array to a specific type\nfunction convertArray( array, type, forceClone ) {\n\n\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t! forceClone && array.constructor === type ) return array;\n\n\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\treturn new type( array ); // create typed array\n\n\t}\n\n\treturn Array.prototype.slice.call( array ); // create Array\n\n}\n\nfunction isTypedArray( object ) {\n\n\treturn ArrayBuffer.isView( object ) &&\n\t\t! ( object instanceof DataView );\n\n}\n\n// returns an array by which times and values can be sorted\nfunction getKeyframeOrder( times ) {\n\n\tfunction compareTime( i, j ) {\n\n\t\treturn times[ i ] - times[ j ];\n\n\t}\n\n\tconst n = times.length;\n\tconst result = new Array( n );\n\tfor ( let i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\tresult.sort( compareTime );\n\n\treturn result;\n\n}\n\n// uses the array previously returned by 'getKeyframeOrder' to sort data\nfunction sortedArray( values, stride, order ) {\n\n\tconst nValues = values.length;\n\tconst result = new values.constructor( nValues );\n\n\tfor ( let i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\tconst srcOffset = order[ i ] * stride;\n\n\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t}\n\n\t}\n\n\treturn result;\n\n}\n\n// function for parsing AOS keyframe formats\nfunction flattenJSON( jsonKeys, times, values, valuePropertyName ) {\n\n\tlet i = 1, key = jsonKeys[ 0 ];\n\n\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\tkey = jsonKeys[ i ++ ];\n\n\t}\n\n\tif ( key === undefined ) return; // no data\n\n\tlet value = key[ valuePropertyName ];\n\tif ( value === undefined ) return; // no data\n\n\tif ( Array.isArray( value ) ) {\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else if ( value.toArray !== undefined ) {\n\n\t\t// ...assume THREE.Math-ish\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else {\n\n\t\t// otherwise push as-is\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push( value );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t}\n\n}\n\nfunction subclip( sourceClip, name, startFrame, endFrame, fps = 30 ) {\n\n\tconst clip = sourceClip.clone();\n\n\tclip.name = name;\n\n\tconst tracks = [];\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tconst track = clip.tracks[ i ];\n\t\tconst valueSize = track.getValueSize();\n\n\t\tconst times = [];\n\t\tconst values = [];\n\n\t\tfor ( let j = 0; j < track.times.length; ++ j ) {\n\n\t\t\tconst frame = track.times[ j ] * fps;\n\n\t\t\tif ( frame < startFrame || frame >= endFrame ) continue;\n\n\t\t\ttimes.push( track.times[ j ] );\n\n\t\t\tfor ( let k = 0; k < valueSize; ++ k ) {\n\n\t\t\t\tvalues.push( track.values[ j * valueSize + k ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( times.length === 0 ) continue;\n\n\t\ttrack.times = convertArray( times, track.times.constructor );\n\t\ttrack.values = convertArray( values, track.values.constructor );\n\n\t\ttracks.push( track );\n\n\t}\n\n\tclip.tracks = tracks;\n\n\t// find minimum .times value across all tracks in the trimmed clip\n\n\tlet minStartTime = Infinity;\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tif ( minStartTime > clip.tracks[ i ].times[ 0 ] ) {\n\n\t\t\tminStartTime = clip.tracks[ i ].times[ 0 ];\n\n\t\t}\n\n\t}\n\n\t// shift all tracks such that clip begins at t=0\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tclip.tracks[ i ].shift( - 1 * minStartTime );\n\n\t}\n\n\tclip.resetDuration();\n\n\treturn clip;\n\n}\n\nfunction makeClipAdditive( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) {\n\n\tif ( fps <= 0 ) fps = 30;\n\n\tconst numTracks = referenceClip.tracks.length;\n\tconst referenceTime = referenceFrame / fps;\n\n\t// Make each track's values relative to the values at the reference frame\n\tfor ( let i = 0; i < numTracks; ++ i ) {\n\n\t\tconst referenceTrack = referenceClip.tracks[ i ];\n\t\tconst referenceTrackType = referenceTrack.ValueTypeName;\n\n\t\t// Skip this track if it's non-numeric\n\t\tif ( referenceTrackType === 'bool' || referenceTrackType === 'string' ) continue;\n\n\t\t// Find the track in the target clip whose name and type matches the reference track\n\t\tconst targetTrack = targetClip.tracks.find( function ( track ) {\n\n\t\t\treturn track.name === referenceTrack.name\n\t\t\t\t&& track.ValueTypeName === referenceTrackType;\n\n\t\t} );\n\n\t\tif ( targetTrack === undefined ) continue;\n\n\t\tlet referenceOffset = 0;\n\t\tconst referenceValueSize = referenceTrack.getValueSize();\n\n\t\tif ( referenceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\treferenceOffset = referenceValueSize / 3;\n\n\t\t}\n\n\t\tlet targetOffset = 0;\n\t\tconst targetValueSize = targetTrack.getValueSize();\n\n\t\tif ( targetTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\ttargetOffset = targetValueSize / 3;\n\n\t\t}\n\n\t\tconst lastIndex = referenceTrack.times.length - 1;\n\t\tlet referenceValue;\n\n\t\t// Find the value to subtract out of the track\n\t\tif ( referenceTime <= referenceTrack.times[ 0 ] ) {\n\n\t\t\t// Reference frame is earlier than the first keyframe, so just use the first keyframe\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\treferenceValue = referenceTrack.values.slice( startIndex, endIndex );\n\n\t\t} else if ( referenceTime >= referenceTrack.times[ lastIndex ] ) {\n\n\t\t\t// Reference frame is after the last keyframe, so just use the last keyframe\n\t\t\tconst startIndex = lastIndex * referenceValueSize + referenceOffset;\n\t\t\tconst endIndex = startIndex + referenceValueSize - referenceOffset;\n\t\t\treferenceValue = referenceTrack.values.slice( startIndex, endIndex );\n\n\t\t} else {\n\n\t\t\t// Interpolate to the reference value\n\t\t\tconst interpolant = referenceTrack.createInterpolant();\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\tinterpolant.evaluate( referenceTime );\n\t\t\treferenceValue = interpolant.resultBuffer.slice( startIndex, endIndex );\n\n\t\t}\n\n\t\t// Conjugate the quaternion\n\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\tconst referenceQuat = new Quaternion().fromArray( referenceValue ).normalize().conjugate();\n\t\t\treferenceQuat.toArray( referenceValue );\n\n\t\t}\n\n\t\t// Subtract the reference value from all of the track values\n\n\t\tconst numTimes = targetTrack.times.length;\n\t\tfor ( let j = 0; j < numTimes; ++ j ) {\n\n\t\t\tconst valueStart = j * targetValueSize + targetOffset;\n\n\t\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\t\t// Multiply the conjugate for quaternion track types\n\t\t\t\tQuaternion.multiplyQuaternionsFlat(\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart,\n\t\t\t\t\treferenceValue,\n\t\t\t\t\t0,\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\tconst valueEnd = targetValueSize - targetOffset * 2;\n\n\t\t\t\t// Subtract each value for all other numeric track types\n\t\t\t\tfor ( let k = 0; k < valueEnd; ++ k ) {\n\n\t\t\t\t\ttargetTrack.values[ valueStart + k ] -= referenceValue[ k ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttargetClip.blendMode = AdditiveAnimationBlendMode;\n\n\treturn targetClip;\n\n}\n\nconst AnimationUtils = {\n\tconvertArray: convertArray,\n\tisTypedArray: isTypedArray,\n\tgetKeyframeOrder: getKeyframeOrder,\n\tsortedArray: sortedArray,\n\tflattenJSON: flattenJSON,\n\tsubclip: subclip,\n\tmakeClipAdditive: makeClipAdditive\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 */\n\nclass Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tthis.parameterPositions = parameterPositions;\n\t\tthis._cachedIndex = 0;\n\n\t\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\t\tthis.sampleValues = sampleValues;\n\t\tthis.valueSize = sampleSize;\n\n\t\tthis.settings = null;\n\t\tthis.DefaultSettings_ = {};\n\n\t}\n\n\tevaluate( t ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet i1 = this._cachedIndex,\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\tlet 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 ( let 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.copySampleValue_( i1 - 1 );\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\tconst 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 ( let 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.copySampleValue_( 0 );\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\tconst 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.copySampleValue_( 0 );\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.copySampleValue_( i1 - 1 );\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\tgetSettings_() {\n\n\t\treturn this.settings || this.DefaultSettings_;\n\n\t}\n\n\tcopySampleValue_( index ) {\n\n\t\t// copies a sample value to the result buffer\n\n\t\tconst 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 ( let 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_( /* 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_( /* i1, t0, t1 */ ) {\n\n\t\t// empty\n\n\t}\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\nclass CubicInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\tthis._weightPrev = - 0;\n\t\tthis._offsetPrev = - 0;\n\t\tthis._weightNext = - 0;\n\t\tthis._offsetNext = - 0;\n\n\t\tthis.DefaultSettings_ = {\n\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\n\t\t};\n\n\t}\n\n\tintervalChanged_( i1, t0, t1 ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet iPrev = 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\tconst 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_( i1, t0, t, t1 ) {\n\n\t\tconst 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\tconst sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\tconst s0 = ( 1 + wP ) * ppp + ( - 1.5 - 2 * wP ) * pp + ( - 0.5 + wP ) * p + 1;\n\t\tconst s1 = ( - 1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\tconst sN = wN * ppp - wN * pp;\n\n\t\t// combine data linearly\n\n\t\tfor ( let 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\nclass LinearInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst 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 ( let 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 preceding\n * the parameter.\n */\n\nclass DiscreteInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1 /*, t0, t, t1 */ ) {\n\n\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t}\n\n}\n\nclass KeyframeTrack {\n\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tif ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' );\n\t\tif ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name );\n\n\t\tthis.name = name;\n\n\t\tthis.times = convertArray( times, this.TimeBufferType );\n\t\tthis.values = convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t}\n\n\t// Serialization (in static context, because of constructor invocation\n\t// and automatic invocation of .toJSON):\n\n\tstatic toJSON( track ) {\n\n\t\tconst trackType = track.constructor;\n\n\t\tlet json;\n\n\t\t// derived classes can define a static toJSON method\n\t\tif ( trackType.toJSON !== this.toJSON ) {\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': convertArray( track.times, Array ),\n\t\t\t\t'values': convertArray( track.values, Array )\n\n\t\t\t};\n\n\t\t\tconst 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\tInterpolantFactoryMethodDiscrete( result ) {\n\n\t\treturn new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new LinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\tInterpolantFactoryMethodSmooth( result ) {\n\n\t\treturn new CubicInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\tsetInterpolation( interpolation ) {\n\n\t\tlet 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\tconst 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 this;\n\n\t\t}\n\n\t\tthis.createInterpolant = factoryMethod;\n\n\t\treturn this;\n\n\t}\n\n\tgetInterpolation() {\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() {\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( timeOffset ) {\n\n\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let 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( timeScale ) {\n\n\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let 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( startTime, endTime ) {\n\n\t\tconst times = this.times,\n\t\t\tnKeys = times.length;\n\n\t\tlet from = 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 ) {\n\n\t\t\t\tto = Math.max( to, 1 );\n\t\t\t\tfrom = to - 1;\n\n\t\t\t}\n\n\t\t\tconst stride = this.getValueSize();\n\t\t\tthis.times = times.slice( from, to );\n\t\t\tthis.values = this.values.slice( 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() {\n\n\t\tlet valid = true;\n\n\t\tconst 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\tconst 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\tlet prevTime = null;\n\n\t\tfor ( let i = 0; i !== nKeys; i ++ ) {\n\n\t\t\tconst 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 ( isTypedArray( values ) ) {\n\n\t\t\t\tfor ( let i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\tconst 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() {\n\n\t\t// times or values may be shared with other tracks, so overwriting is unsafe\n\t\tconst times = this.times.slice(),\n\t\t\tvalues = this.values.slice(),\n\t\t\tstride = this.getValueSize(),\n\n\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\tlastIndex = times.length - 1;\n\n\t\tlet writeIndex = 1;\n\n\t\tfor ( let i = 1; i < lastIndex; ++ i ) {\n\n\t\t\tlet keep = false;\n\n\t\t\tconst time = times[ i ];\n\t\t\tconst 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 !== times[ 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\tconst 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 ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tconst 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\tconst readOffset = i * stride,\n\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\tfor ( let 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 ( let 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 = times.slice( 0, writeIndex );\n\t\t\tthis.values = values.slice( 0, writeIndex * stride );\n\n\t\t} else {\n\n\t\t\tthis.times = times;\n\t\t\tthis.values = values;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\tconst times = this.times.slice();\n\t\tconst values = this.values.slice();\n\n\t\tconst TypedKeyframeTrack = this.constructor;\n\t\tconst track = new TypedKeyframeTrack( this.name, times, values );\n\n\t\t// Interpolant argument to constructor is not saved, so copy the factory method directly.\n\t\ttrack.createInterpolant = this.createInterpolant;\n\n\t\treturn track;\n\n\t}\n\n}\n\nKeyframeTrack.prototype.TimeBufferType = Float32Array;\nKeyframeTrack.prototype.ValueBufferType = Float32Array;\nKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;\n\n/**\n * A Track of Boolean keyframe values.\n */\nclass BooleanKeyframeTrack extends KeyframeTrack {}\n\nBooleanKeyframeTrack.prototype.ValueTypeName = 'bool';\nBooleanKeyframeTrack.prototype.ValueBufferType = Array;\nBooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A Track of keyframe values that represent color.\n */\nclass ColorKeyframeTrack extends KeyframeTrack {}\n\nColorKeyframeTrack.prototype.ValueTypeName = 'color';\n\n/**\n * A Track of numeric keyframe values.\n */\nclass NumberKeyframeTrack extends KeyframeTrack {}\n\nNumberKeyframeTrack.prototype.ValueTypeName = 'number';\n\n/**\n * Spherical linear unit quaternion interpolant.\n */\n\nclass QuaternionLinearInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\tlet offset = i1 * stride;\n\n\t\tfor ( let 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 * A Track of quaternion keyframe values.\n */\nclass QuaternionKeyframeTrack extends KeyframeTrack {\n\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n}\n\nQuaternionKeyframeTrack.prototype.ValueTypeName = 'quaternion';\n// ValueBufferType is inherited\nQuaternionKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;\nQuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A Track that interpolates Strings\n */\nclass StringKeyframeTrack extends KeyframeTrack {}\n\nStringKeyframeTrack.prototype.ValueTypeName = 'string';\nStringKeyframeTrack.prototype.ValueBufferType = Array;\nStringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A Track of vectored keyframe values.\n */\nclass VectorKeyframeTrack extends KeyframeTrack {}\n\nVectorKeyframeTrack.prototype.ValueTypeName = 'vector';\n\nclass AnimationClip {\n\n\tconstructor( name, duration = - 1, tracks, blendMode = NormalAnimationBlendMode ) {\n\n\t\tthis.name = name;\n\t\tthis.tracks = tracks;\n\t\tthis.duration = duration;\n\t\tthis.blendMode = blendMode;\n\n\t\tthis.uuid = generateUUID();\n\n\t\t// this means it should figure out its duration by scanning the tracks\n\t\tif ( this.duration < 0 ) {\n\n\t\t\tthis.resetDuration();\n\n\t\t}\n\n\t}\n\n\n\tstatic parse( json ) {\n\n\t\tconst tracks = [],\n\t\t\tjsonTracks = json.tracks,\n\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\tfor ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t}\n\n\t\tconst clip = new this( json.name, json.duration, tracks, json.blendMode );\n\t\tclip.uuid = json.uuid;\n\n\t\treturn clip;\n\n\t}\n\n\tstatic toJSON( clip ) {\n\n\t\tconst tracks = [],\n\t\t\tclipTracks = clip.tracks;\n\n\t\tconst json = {\n\n\t\t\t'name': clip.name,\n\t\t\t'duration': clip.duration,\n\t\t\t'tracks': tracks,\n\t\t\t'uuid': clip.uuid,\n\t\t\t'blendMode': clip.blendMode\n\n\t\t};\n\n\t\tfor ( let 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\tstatic CreateFromMorphTargetSequence( name, morphTargetSequence, fps, noLoop ) {\n\n\t\tconst numMorphTargets = morphTargetSequence.length;\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\tlet times = [];\n\t\t\tlet 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\tconst order = getKeyframeOrder( times );\n\t\t\ttimes = sortedArray( times, 1, order );\n\t\t\tvalues = 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 this( name, - 1, tracks );\n\n\t}\n\n\tstatic findByName( objectOrClipArray, name ) {\n\n\t\tlet clipArray = objectOrClipArray;\n\n\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\tconst o = objectOrClipArray;\n\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t}\n\n\t\tfor ( let 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\tstatic CreateClipsFromMorphTargetSequences( morphTargets, fps, noLoop ) {\n\n\t\tconst 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\tconst 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 ( let i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\tconst parts = morphTarget.name.match( pattern );\n\n\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\tconst name = parts[ 1 ];\n\n\t\t\t\tlet animationMorphTargets = animationToMorphTargets[ name ];\n\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\tconst clips = [];\n\n\t\tfor ( const name in animationToMorphTargets ) {\n\n\t\t\tclips.push( this.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\tstatic parseAnimation( 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\tconst 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\tconst times = [];\n\t\t\t\tconst values = [];\n\n\t\t\t\tflattenJSON( 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\tconst tracks = [];\n\n\t\tconst clipName = animation.name || 'default';\n\t\tconst fps = animation.fps || 30;\n\t\tconst blendMode = animation.blendMode;\n\n\t\t// automatic length determination in AnimationClip.\n\t\tlet duration = animation.length || - 1;\n\n\t\tconst hierarchyTracks = animation.hierarchy || [];\n\n\t\tfor ( let h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\tconst 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\tconst morphTargetNames = {};\n\n\t\t\t\tlet k;\n\n\t\t\t\tfor ( k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\tif ( animationKeys[ k ].morphTargets ) {\n\n\t\t\t\t\t\tfor ( let 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 ( const morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\tconst times = [];\n\t\t\t\t\tconst values = [];\n\n\t\t\t\t\tfor ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\tconst 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;\n\n\t\t\t} else {\n\n\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\tconst 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\tconst clip = new this( clipName, duration, tracks, blendMode );\n\n\t\treturn clip;\n\n\t}\n\n\tresetDuration() {\n\n\t\tconst tracks = this.tracks;\n\t\tlet duration = 0;\n\n\t\tfor ( let i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\tconst 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\treturn this;\n\n\t}\n\n\ttrim() {\n\n\t\tfor ( let 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\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tvalid = valid && this.tracks[ i ].validate();\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\toptimize() {\n\n\t\tfor ( let 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\tclone() {\n\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\ttracks.push( this.tracks[ i ].clone() );\n\n\t\t}\n\n\t\treturn new this.constructor( this.name, this.duration, tracks, this.blendMode );\n\n\t}\n\n\ttoJSON() {\n\n\t\treturn this.constructor.toJSON( this );\n\n\t}\n\n}\n\nfunction getTrackTypeForValueTypeName( typeName ) {\n\n\tswitch ( typeName.toLowerCase() ) {\n\n\t\tcase 'scalar':\n\t\tcase 'double':\n\t\tcase 'float':\n\t\tcase 'number':\n\t\tcase 'integer':\n\n\t\t\treturn NumberKeyframeTrack;\n\n\t\tcase 'vector':\n\t\tcase 'vector2':\n\t\tcase 'vector3':\n\t\tcase 'vector4':\n\n\t\t\treturn VectorKeyframeTrack;\n\n\t\tcase 'color':\n\n\t\t\treturn ColorKeyframeTrack;\n\n\t\tcase 'quaternion':\n\n\t\t\treturn QuaternionKeyframeTrack;\n\n\t\tcase 'bool':\n\t\tcase 'boolean':\n\n\t\t\treturn BooleanKeyframeTrack;\n\n\t\tcase 'string':\n\n\t\t\treturn StringKeyframeTrack;\n\n\t}\n\n\tthrow new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );\n\n}\n\nfunction parseKeyframeTrack( json ) {\n\n\tif ( json.type === undefined ) {\n\n\t\tthrow new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );\n\n\t}\n\n\tconst trackType = getTrackTypeForValueTypeName( json.type );\n\n\tif ( json.times === undefined ) {\n\n\t\tconst times = [], values = [];\n\n\t\tflattenJSON( json.keys, times, values, 'value' );\n\n\t\tjson.times = times;\n\t\tjson.values = values;\n\n\t}\n\n\t// derived classes can define a static parse method\n\tif ( trackType.parse !== undefined ) {\n\n\t\treturn trackType.parse( json );\n\n\t} else {\n\n\t\t// by default, we assume a constructor compatible with the base\n\t\treturn new trackType( json.name, json.times, json.values, json.interpolation );\n\n\t}\n\n}\n\nconst 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\nclass LoadingManager {\n\n\tconstructor( onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet isLoading = false;\n\t\tlet itemsLoaded = 0;\n\t\tlet itemsTotal = 0;\n\t\tlet urlModifier = undefined;\n\t\tconst handlers = [];\n\n\t\t// Refer to #5689 for the reason why we don't set .onStart\n\t\t// in the constructor\n\n\t\tthis.onStart = undefined;\n\t\tthis.onLoad = onLoad;\n\t\tthis.onProgress = onProgress;\n\t\tthis.onError = onError;\n\n\t\tthis.itemStart = function ( url ) {\n\n\t\t\titemsTotal ++;\n\n\t\t\tif ( isLoading === false ) {\n\n\t\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tisLoading = true;\n\n\t\t};\n\n\t\tthis.itemEnd = function ( url ) {\n\n\t\t\titemsLoaded ++;\n\n\t\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\t\tisLoading = false;\n\n\t\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\t\tscope.onLoad();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.itemError = function ( url ) {\n\n\t\t\tif ( scope.onError !== undefined ) {\n\n\t\t\t\tscope.onError( url );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.resolveURL = function ( url ) {\n\n\t\t\tif ( urlModifier ) {\n\n\t\t\t\treturn urlModifier( url );\n\n\t\t\t}\n\n\t\t\treturn url;\n\n\t\t};\n\n\t\tthis.setURLModifier = function ( transform ) {\n\n\t\t\turlModifier = transform;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\tthis.addHandler = function ( regex, loader ) {\n\n\t\t\thandlers.push( regex, loader );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\tthis.removeHandler = function ( regex ) {\n\n\t\t\tconst index = handlers.indexOf( regex );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\thandlers.splice( index, 2 );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\tthis.getHandler = function ( file ) {\n\n\t\t\tfor ( let i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tconst regex = handlers[ i ];\n\t\t\t\tconst loader = handlers[ i + 1 ];\n\n\t\t\t\tif ( regex.global ) regex.lastIndex = 0; // see #17920\n\n\t\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\t\treturn loader;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t};\n\n\t}\n\n}\n\nconst DefaultLoadingManager = /*@__PURE__*/ new LoadingManager();\n\nclass Loader {\n\n\tconstructor( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\tthis.crossOrigin = 'anonymous';\n\t\tthis.withCredentials = false;\n\t\tthis.path = '';\n\t\tthis.resourcePath = '';\n\t\tthis.requestHeader = {};\n\n\t}\n\n\tload( /* url, onLoad, onProgress, onError */ ) {}\n\n\tloadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.load( url, resolve, onProgress, reject );\n\n\t\t} );\n\n\t}\n\n\tparse( /* data */ ) {}\n\n\tsetCrossOrigin( crossOrigin ) {\n\n\t\tthis.crossOrigin = crossOrigin;\n\t\treturn this;\n\n\t}\n\n\tsetWithCredentials( value ) {\n\n\t\tthis.withCredentials = value;\n\t\treturn this;\n\n\t}\n\n\tsetPath( path ) {\n\n\t\tthis.path = path;\n\t\treturn this;\n\n\t}\n\n\tsetResourcePath( resourcePath ) {\n\n\t\tthis.resourcePath = resourcePath;\n\t\treturn this;\n\n\t}\n\n\tsetRequestHeader( requestHeader ) {\n\n\t\tthis.requestHeader = requestHeader;\n\t\treturn this;\n\n\t}\n\n}\n\nLoader.DEFAULT_MATERIAL_NAME = '__DEFAULT';\n\nconst loading = {};\n\nclass HttpError extends Error {\n\n\tconstructor( message, response ) {\n\n\t\tsuper( message );\n\t\tthis.response = response;\n\n\t}\n\n}\n\nclass FileLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( 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\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tthis.manager.itemStart( url );\n\n\t\t\tsetTimeout( () => {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tthis.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// Initialise array for duplicate requests\n\t\tloading[ url ] = [];\n\n\t\tloading[ url ].push( {\n\t\t\tonLoad: onLoad,\n\t\t\tonProgress: onProgress,\n\t\t\tonError: onError,\n\t\t} );\n\n\t\t// create request\n\t\tconst req = new Request( url, {\n\t\t\theaders: new Headers( this.requestHeader ),\n\t\t\tcredentials: this.withCredentials ? 'include' : 'same-origin',\n\t\t\t// An abort controller could be added within a future PR\n\t\t} );\n\n\t\t// record states ( avoid data race )\n\t\tconst mimeType = this.mimeType;\n\t\tconst responseType = this.responseType;\n\n\t\t// start the fetch\n\t\tfetch( req )\n\t\t\t.then( response => {\n\n\t\t\t\tif ( response.status === 200 || response.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\tif ( response.status === 0 ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Workaround: Checking if response.body === undefined for Alipay browser #23548\n\n\t\t\t\t\tif ( typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined ) {\n\n\t\t\t\t\t\treturn response;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\t\tconst reader = response.body.getReader();\n\n\t\t\t\t\t// Nginx needs X-File-Size check\n\t\t\t\t\t// https://serverfault.com/questions/482875/why-does-nginx-remove-content-length-header-for-chunked-content\n\t\t\t\t\tconst contentLength = response.headers.get( 'Content-Length' ) || response.headers.get( 'X-File-Size' );\n\t\t\t\t\tconst total = contentLength ? parseInt( contentLength ) : 0;\n\t\t\t\t\tconst lengthComputable = total !== 0;\n\t\t\t\t\tlet loaded = 0;\n\n\t\t\t\t\t// periodically read data into the new stream tracking while download progress\n\t\t\t\t\tconst stream = new ReadableStream( {\n\t\t\t\t\t\tstart( controller ) {\n\n\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\tfunction readData() {\n\n\t\t\t\t\t\t\t\treader.read().then( ( { done, value } ) => {\n\n\t\t\t\t\t\t\t\t\tif ( done ) {\n\n\t\t\t\t\t\t\t\t\t\tcontroller.close();\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tloaded += value.byteLength;\n\n\t\t\t\t\t\t\t\t\t\tconst event = new ProgressEvent( 'progress', { lengthComputable, loaded, total } );\n\t\t\t\t\t\t\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\t\t\t\t\t\t\tif ( callback.onProgress ) callback.onProgress( event );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tcontroller.enqueue( value );\n\t\t\t\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn new Response( stream );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new HttpError( `fetch for \"${response.url}\" responded with ${response.status}: ${response.statusText}`, response );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( response => {\n\n\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\tcase 'arraybuffer':\n\n\t\t\t\t\t\treturn response.arrayBuffer();\n\n\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\treturn response.blob();\n\n\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\treturn response.text()\n\t\t\t\t\t\t\t.then( text => {\n\n\t\t\t\t\t\t\t\tconst parser = new DOMParser();\n\t\t\t\t\t\t\t\treturn parser.parseFromString( text, mimeType );\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\treturn response.json();\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( mimeType === undefined ) {\n\n\t\t\t\t\t\t\treturn response.text();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// sniff encoding\n\t\t\t\t\t\t\tconst re = /charset=\"?([^;\"\\s]*)\"?/i;\n\t\t\t\t\t\t\tconst exec = re.exec( mimeType );\n\t\t\t\t\t\t\tconst label = exec && exec[ 1 ] ? exec[ 1 ].toLowerCase() : undefined;\n\t\t\t\t\t\t\tconst decoder = new TextDecoder( label );\n\t\t\t\t\t\t\treturn response.arrayBuffer().then( ab => decoder.decode( ab ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( data => {\n\n\t\t\t\t// Add to cache only on HTTP success, so that we do not cache\n\t\t\t\t// error response bodies as proper responses to requests.\n\t\t\t\tCache.add( url, data );\n\n\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onLoad ) callback.onLoad( data );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.catch( err => {\n\n\t\t\t\t// Abort errors and other errors are handled the same\n\n\t\t\t\tconst callbacks = loading[ url ];\n\n\t\t\t\tif ( callbacks === undefined ) {\n\n\t\t\t\t\t// When onLoad was called and url was deleted in `loading`\n\t\t\t\t\tthis.manager.itemError( url );\n\t\t\t\t\tthrow err;\n\n\t\t\t\t}\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onError ) callback.onError( err );\n\n\t\t\t\t}\n\n\t\t\t\tthis.manager.itemError( url );\n\n\t\t\t} )\n\t\t\t.finally( () => {\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\tthis.manager.itemStart( url );\n\n\t}\n\n\tsetResponseType( value ) {\n\n\t\tthis.responseType = value;\n\t\treturn this;\n\n\t}\n\n\tsetMimeType( value ) {\n\n\t\tthis.mimeType = value;\n\t\treturn this;\n\n\t}\n\n}\n\nclass AnimationLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\tconst animations = [];\n\n\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\tconst 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}\n\n/**\n * Abstract Base class to block based textures loader (dds, pvr, ...)\n *\n * Sub classes have to implement the parse() method which will be used in load().\n */\n\nclass CompressedTextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst images = [];\n\n\t\tconst texture = new CompressedTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( 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 ) texture.minFilter = LinearFilter;\n\n\t\t\t\t\ttexture.image = images;\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\tfor ( let 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\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\tconst faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\tfor ( let f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\timages[ f ] = { mipmaps: [] };\n\n\t\t\t\t\t\tfor ( let 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\ttexture.image = images;\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}\n\nclass ImageLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst 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\tconst image = createElementNS( 'img' );\n\n\t\tfunction onImageLoad() {\n\n\t\t\tremoveEventListeners();\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}\n\n\t\tfunction onImageError( event ) {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tif ( onError ) onError( event );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction removeEventListeners() {\n\n\t\t\timage.removeEventListener( 'load', onImageLoad, false );\n\t\t\timage.removeEventListener( 'error', onImageError, false );\n\n\t\t}\n\n\t\timage.addEventListener( 'load', onImageLoad, false );\n\t\timage.addEventListener( 'error', onImageError, false );\n\n\t\tif ( url.slice( 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}\n\nclass CubeTextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( urls, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new CubeTexture();\n\t\ttexture.colorSpace = SRGBColorSpace;\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tlet 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 ( let 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}\n\n/**\n * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n *\n * Sub classes have to implement the parse() method which will be used in load().\n */\n\nclass DataTextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst texture = new DataTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setPath( this.path );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\tlet texData;\n\n\t\t\ttry {\n\n\t\t\t\ttexData = scope.parse( buffer );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) {\n\n\t\t\t\t\tonError( error );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texData.image !== undefined ) {\n\n\t\t\t\ttexture.image = texData.image;\n\n\t\t\t} else if ( texData.data !== undefined ) {\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 = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\ttexture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\ttexture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter;\n\t\t\ttexture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter;\n\n\t\t\ttexture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1;\n\n\t\t\tif ( texData.colorSpace !== undefined ) {\n\n\t\t\t\ttexture.colorSpace = texData.colorSpace;\n\n\t\t\t} else if ( texData.encoding !== undefined ) { // @deprecated, r152\n\n\t\t\t\ttexture.encoding = texData.encoding;\n\n\t\t\t}\n\n\t\t\tif ( texData.flipY !== undefined ) {\n\n\t\t\t\ttexture.flipY = texData.flipY;\n\n\t\t\t}\n\n\t\t\tif ( texData.format !== undefined ) {\n\n\t\t\t\ttexture.format = texData.format;\n\n\t\t\t}\n\n\t\t\tif ( texData.type !== undefined ) {\n\n\t\t\t\ttexture.type = texData.type;\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmaps !== undefined ) {\n\n\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\t\t\t\ttexture.minFilter = LinearMipmapLinearFilter; // presumably...\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmapCount === 1 ) {\n\n\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t}\n\n\t\t\tif ( texData.generateMipmaps !== undefined ) {\n\n\t\t\t\ttexture.generateMipmaps = texData.generateMipmaps;\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\nclass TextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new Texture();\n\n\t\tconst 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\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}\n\nclass Light extends Object3D {\n\n\tconstructor( color, intensity = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.isLight = true;\n\n\t\tthis.type = 'Light';\n\n\t\tthis.color = new Color( color );\n\t\tthis.intensity = intensity;\n\n\t}\n\n\tdispose() {\n\n\t\t// Empty here in base class; some subclasses override.\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\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( meta ) {\n\n\t\tconst data = super.toJSON( 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\nclass HemisphereLight extends Light {\n\n\tconstructor( skyColor, groundColor, intensity ) {\n\n\t\tsuper( skyColor, intensity );\n\n\t\tthis.isHemisphereLight = true;\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.groundColor.copy( source.groundColor );\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _projScreenMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld$1 = /*@__PURE__*/ new Vector3();\nconst _lookTarget$1 = /*@__PURE__*/ new Vector3();\n\nclass LightShadow {\n\n\tconstructor( camera ) {\n\n\t\tthis.camera = camera;\n\n\t\tthis.bias = 0;\n\t\tthis.normalBias = 0;\n\t\tthis.radius = 1;\n\t\tthis.blurSamples = 8;\n\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\tthis.map = null;\n\t\tthis.mapPass = null;\n\t\tthis.matrix = new Matrix4();\n\n\t\tthis.autoUpdate = true;\n\t\tthis.needsUpdate = false;\n\n\t\tthis._frustum = new Frustum();\n\t\tthis._frameExtents = new Vector2( 1, 1 );\n\n\t\tthis._viewportCount = 1;\n\n\t\tthis._viewports = [\n\n\t\t\tnew Vector4( 0, 0, 1, 1 )\n\n\t\t];\n\n\t}\n\n\tgetViewportCount() {\n\n\t\treturn this._viewportCount;\n\n\t}\n\n\tgetFrustum() {\n\n\t\treturn this._frustum;\n\n\t}\n\n\tupdateMatrices( light ) {\n\n\t\tconst shadowCamera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\t_lightPositionWorld$1.setFromMatrixPosition( light.matrixWorld );\n\t\tshadowCamera.position.copy( _lightPositionWorld$1 );\n\n\t\t_lookTarget$1.setFromMatrixPosition( light.target.matrixWorld );\n\t\tshadowCamera.lookAt( _lookTarget$1 );\n\t\tshadowCamera.updateMatrixWorld();\n\n\t\t_projScreenMatrix$1.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix$1 );\n\n\t\tshadowMatrix.set(\n\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t);\n\n\t\tshadowMatrix.multiply( _projScreenMatrix$1 );\n\n\t}\n\n\tgetViewport( viewportIndex ) {\n\n\t\treturn this._viewports[ viewportIndex ];\n\n\t}\n\n\tgetFrameExtents() {\n\n\t\treturn this._frameExtents;\n\n\t}\n\n\tdispose() {\n\n\t\tif ( this.map ) {\n\n\t\t\tthis.map.dispose();\n\n\t\t}\n\n\t\tif ( this.mapPass ) {\n\n\t\t\tthis.mapPass.dispose();\n\n\t\t}\n\n\t}\n\n\tcopy( 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() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst object = {};\n\n\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\tif ( this.normalBias !== 0 ) object.normalBias = this.normalBias;\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\nclass SpotLightShadow extends LightShadow {\n\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t\tthis.isSpotLightShadow = true;\n\n\t\tthis.focus = 1;\n\n\t}\n\n\tupdateMatrices( light ) {\n\n\t\tconst camera = this.camera;\n\n\t\tconst fov = RAD2DEG * 2 * light.angle * this.focus;\n\t\tconst aspect = this.mapSize.width / this.mapSize.height;\n\t\tconst 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\tsuper.updateMatrices( light );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.focus = source.focus;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass SpotLight extends Light {\n\n\tconstructor( color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.isSpotLight = true;\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.distance = distance;\n\t\tthis.angle = angle;\n\t\tthis.penumbra = penumbra;\n\t\tthis.decay = decay;\n\n\t\tthis.map = null;\n\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// by convention for a spotlight, luminous power (lm) = π * luminous intensity (cd)\n\t\treturn this.intensity * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / Math.PI;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\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\nconst _projScreenMatrix = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld = /*@__PURE__*/ new Vector3();\nconst _lookTarget = /*@__PURE__*/ new Vector3();\n\nclass PointLightShadow extends LightShadow {\n\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t\tthis.isPointLightShadow = true;\n\n\t\tthis._frameExtents = new Vector2( 4, 2 );\n\n\t\tthis._viewportCount = 6;\n\n\t\tthis._viewports = [\n\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t// following orientation:\n\t\t\t//\n\t\t\t// xzXZ\n\t\t\t// y Y\n\t\t\t//\n\t\t\t// X - Positive x direction\n\t\t\t// x - Negative x direction\n\t\t\t// Y - Positive y direction\n\t\t\t// y - Negative y direction\n\t\t\t// Z - Positive z direction\n\t\t\t// z - Negative z direction\n\n\t\t\t// positive X\n\t\t\tnew Vector4( 2, 1, 1, 1 ),\n\t\t\t// negative X\n\t\t\tnew Vector4( 0, 1, 1, 1 ),\n\t\t\t// positive Z\n\t\t\tnew Vector4( 3, 1, 1, 1 ),\n\t\t\t// negative Z\n\t\t\tnew Vector4( 1, 1, 1, 1 ),\n\t\t\t// positive Y\n\t\t\tnew Vector4( 3, 0, 1, 1 ),\n\t\t\t// negative Y\n\t\t\tnew Vector4( 1, 0, 1, 1 )\n\t\t];\n\n\t\tthis._cubeDirections = [\n\t\t\tnew Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\t\tnew Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )\n\t\t];\n\n\t\tthis._cubeUps = [\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, - 1 )\n\t\t];\n\n\t}\n\n\tupdateMatrices( light, viewportIndex = 0 ) {\n\n\t\tconst camera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( far !== camera.far ) {\n\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\tcamera.position.copy( _lightPositionWorld );\n\n\t\t_lookTarget.copy( camera.position );\n\t\t_lookTarget.add( this._cubeDirections[ viewportIndex ] );\n\t\tcamera.up.copy( this._cubeUps[ viewportIndex ] );\n\t\tcamera.lookAt( _lookTarget );\n\t\tcamera.updateMatrixWorld();\n\n\t\tshadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix );\n\n\t}\n\n}\n\nclass PointLight extends Light {\n\n\tconstructor( color, intensity, distance = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.isPointLight = true;\n\n\t\tthis.type = 'PointLight';\n\n\t\tthis.distance = distance;\n\t\tthis.decay = decay;\n\n\t\tthis.shadow = new PointLightShadow();\n\n\t}\n\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// for an isotropic light source, luminous power (lm) = 4 π luminous intensity (cd)\n\t\treturn this.intensity * 4 * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( 4 * Math.PI );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\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\nclass DirectionalLightShadow extends LightShadow {\n\n\tconstructor() {\n\n\t\tsuper( new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\n\n\t\tthis.isDirectionalLightShadow = true;\n\n\t}\n\n}\n\nclass DirectionalLight extends Light {\n\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.isDirectionalLight = true;\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.target = source.target.clone();\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass AmbientLight extends Light {\n\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.isAmbientLight = true;\n\n\t\tthis.type = 'AmbientLight';\n\n\t}\n\n}\n\nclass RectAreaLight extends Light {\n\n\tconstructor( color, intensity, width = 10, height = 10 ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.isRectAreaLight = true;\n\n\t\tthis.type = 'RectAreaLight';\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t}\n\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in nits)\n\t\treturn this.intensity * this.width * this.height * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in nits) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( this.width * this.height * Math.PI );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( 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( meta ) {\n\n\t\tconst data = super.toJSON( 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 * Primary reference:\n * https://graphics.stanford.edu/papers/envmap/envmap.pdf\n *\n * Secondary reference:\n * https://www.ppsloan.org/publications/StupidSH36.pdf\n */\n\n// 3-band SH defined by 9 coefficients\n\nclass SphericalHarmonics3 {\n\n\tconstructor() {\n\n\t\tthis.isSphericalHarmonics3 = true;\n\n\t\tthis.coefficients = [];\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients.push( new Vector3() );\n\n\t\t}\n\n\t}\n\n\tset( coefficients ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].copy( coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tzero() {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// get the radiance in the direction of the normal\n\t// target is a Vector3\n\tgetAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 );\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 0.488603 * y );\n\t\ttarget.addScaledVector( coeff[ 2 ], 0.488603 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 0.488603 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) );\n\t\ttarget.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) );\n\t\ttarget.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) );\n\n\t\treturn target;\n\n\t}\n\n\t// get the irradiance (radiance convolved with cosine lobe) in the direction of the normal\n\t// target is a Vector3\n\t// https://graphics.stanford.edu/papers/envmap/envmap.pdf\n\tgetIrradianceAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603\n\t\ttarget.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548\n\t\ttarget.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3\n\t\ttarget.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274\n\n\t\treturn target;\n\n\t}\n\n\tadd( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].add( sh.coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\taddScaledSH( sh, s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tscale( s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].multiplyScalar( s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tlerp( sh, alpha ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].lerp( sh.coefficients[ i ], alpha );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tequals( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) {\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\tcopy( sh ) {\n\n\t\treturn this.set( sh.coefficients );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].fromArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].toArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn array;\n\n\t}\n\n\t// evaluate the basis functions\n\t// shBasis is an Array[ 9 ]\n\tstatic getBasisAt( normal, shBasis ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\t// band 0\n\t\tshBasis[ 0 ] = 0.282095;\n\n\t\t// band 1\n\t\tshBasis[ 1 ] = 0.488603 * y;\n\t\tshBasis[ 2 ] = 0.488603 * z;\n\t\tshBasis[ 3 ] = 0.488603 * x;\n\n\t\t// band 2\n\t\tshBasis[ 4 ] = 1.092548 * x * y;\n\t\tshBasis[ 5 ] = 1.092548 * y * z;\n\t\tshBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 );\n\t\tshBasis[ 7 ] = 1.092548 * x * z;\n\t\tshBasis[ 8 ] = 0.546274 * ( x * x - y * y );\n\n\t}\n\n}\n\nclass LightProbe extends Light {\n\n\tconstructor( sh = new SphericalHarmonics3(), intensity = 1 ) {\n\n\t\tsuper( undefined, intensity );\n\n\t\tthis.isLightProbe = true;\n\n\t\tthis.sh = sh;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.sh.copy( source.sh );\n\n\t\treturn this;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tthis.intensity = json.intensity; // TODO: Move this bit to Light.fromJSON();\n\t\tthis.sh.fromArray( json.sh );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.sh = this.sh.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass MaterialLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\t\tthis.textures = {};\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\tconst 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\tconst material = MaterialLoader.createMaterialFromType( 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 !== 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.sheen !== undefined ) material.sheen = json.sheen;\n\t\tif ( json.sheenColor !== undefined ) material.sheenColor = new Color().setHex( json.sheenColor );\n\t\tif ( json.sheenRoughness !== undefined ) material.sheenRoughness = json.sheenRoughness;\n\t\tif ( json.emissive !== undefined && material.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\tif ( json.specular !== undefined && material.specular !== undefined ) material.specular.setHex( json.specular );\n\t\tif ( json.specularIntensity !== undefined ) material.specularIntensity = json.specularIntensity;\n\t\tif ( json.specularColor !== undefined && material.specularColor !== undefined ) material.specularColor.setHex( json.specularColor );\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.iridescence !== undefined ) material.iridescence = json.iridescence;\n\t\tif ( json.iridescenceIOR !== undefined ) material.iridescenceIOR = json.iridescenceIOR;\n\t\tif ( json.iridescenceThicknessRange !== undefined ) material.iridescenceThicknessRange = json.iridescenceThicknessRange;\n\t\tif ( json.transmission !== undefined ) material.transmission = json.transmission;\n\t\tif ( json.thickness !== undefined ) material.thickness = json.thickness;\n\t\tif ( json.attenuationDistance !== undefined ) material.attenuationDistance = json.attenuationDistance;\n\t\tif ( json.attenuationColor !== undefined && material.attenuationColor !== undefined ) material.attenuationColor.setHex( json.attenuationColor );\n\t\tif ( json.anisotropy !== undefined ) material.anisotropy = json.anisotropy;\n\t\tif ( json.anisotropyRotation !== undefined ) material.anisotropyRotation = json.anisotropyRotation;\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.combine !== undefined ) material.combine = json.combine;\n\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\tif ( json.shadowSide !== undefined ) material.shadowSide = json.shadowSide;\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.alphaHash !== undefined ) material.alphaHash = json.alphaHash;\n\t\tif ( json.depthFunc !== undefined ) material.depthFunc = json.depthFunc;\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.blendSrc !== undefined ) material.blendSrc = json.blendSrc;\n\t\tif ( json.blendDst !== undefined ) material.blendDst = json.blendDst;\n\t\tif ( json.blendEquation !== undefined ) material.blendEquation = json.blendEquation;\n\t\tif ( json.blendSrcAlpha !== undefined ) material.blendSrcAlpha = json.blendSrcAlpha;\n\t\tif ( json.blendDstAlpha !== undefined ) material.blendDstAlpha = json.blendDstAlpha;\n\t\tif ( json.blendEquationAlpha !== undefined ) material.blendEquationAlpha = json.blendEquationAlpha;\n\t\tif ( json.blendColor !== undefined && material.blendColor !== undefined ) material.blendColor.setHex( json.blendColor );\n\t\tif ( json.blendAlpha !== undefined ) material.blendAlpha = json.blendAlpha;\n\t\tif ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask;\n\t\tif ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc;\n\t\tif ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef;\n\t\tif ( json.stencilFuncMask !== undefined ) material.stencilFuncMask = json.stencilFuncMask;\n\t\tif ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail;\n\t\tif ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail;\n\t\tif ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass;\n\t\tif ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite;\n\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 !== undefined ) 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.dithering !== undefined ) material.dithering = json.dithering;\n\n\t\tif ( json.alphaToCoverage !== undefined ) material.alphaToCoverage = json.alphaToCoverage;\n\t\tif ( json.premultipliedAlpha !== undefined ) material.premultipliedAlpha = json.premultipliedAlpha;\n\t\tif ( json.forceSinglePass !== undefined ) material.forceSinglePass = json.forceSinglePass;\n\n\t\tif ( json.visible !== undefined ) material.visible = json.visible;\n\n\t\tif ( json.toneMapped !== undefined ) material.toneMapped = json.toneMapped;\n\n\t\tif ( json.userData !== undefined ) material.userData = json.userData;\n\n\t\tif ( json.vertexColors !== undefined ) {\n\n\t\t\tif ( typeof json.vertexColors === 'number' ) {\n\n\t\t\t\tmaterial.vertexColors = ( json.vertexColors > 0 ) ? true : false;\n\n\t\t\t} else {\n\n\t\t\t\tmaterial.vertexColors = json.vertexColors;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Shader Material\n\n\t\tif ( json.uniforms !== undefined ) {\n\n\t\t\tfor ( const name in json.uniforms ) {\n\n\t\t\t\tconst uniform = json.uniforms[ name ];\n\n\t\t\t\tmaterial.uniforms[ name ] = {};\n\n\t\t\t\tswitch ( uniform.type ) {\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = getTexture( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Color().setHex( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v2':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector2().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = uniform.value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.defines !== undefined ) material.defines = json.defines;\n\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\tif ( json.glslVersion !== undefined ) material.glslVersion = json.glslVersion;\n\n\t\tif ( json.extensions !== undefined ) {\n\n\t\t\tfor ( const key in json.extensions ) {\n\n\t\t\t\tmaterial.extensions[ key ] = json.extensions[ key ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.lights !== undefined ) material.lights = json.lights;\n\t\tif ( json.clipping !== undefined ) material.clipping = json.clipping;\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\t\tif ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap );\n\n\t\tif ( json.alphaMap !== undefined ) material.alphaMap = getTexture( json.alphaMap );\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.normalMapType !== undefined ) material.normalMapType = json.normalMapType;\n\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\tlet 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\t\tif ( json.specularIntensityMap !== undefined ) material.specularIntensityMap = getTexture( json.specularIntensityMap );\n\t\tif ( json.specularColorMap !== undefined ) material.specularColorMap = getTexture( json.specularColorMap );\n\n\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\t\tif ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity;\n\n\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\t\tif ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio;\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\tif ( json.clearcoatMap !== undefined ) material.clearcoatMap = getTexture( json.clearcoatMap );\n\t\tif ( json.clearcoatRoughnessMap !== undefined ) material.clearcoatRoughnessMap = getTexture( json.clearcoatRoughnessMap );\n\t\tif ( json.clearcoatNormalMap !== undefined ) material.clearcoatNormalMap = getTexture( json.clearcoatNormalMap );\n\t\tif ( json.clearcoatNormalScale !== undefined ) material.clearcoatNormalScale = new Vector2().fromArray( json.clearcoatNormalScale );\n\n\t\tif ( json.iridescenceMap !== undefined ) material.iridescenceMap = getTexture( json.iridescenceMap );\n\t\tif ( json.iridescenceThicknessMap !== undefined ) material.iridescenceThicknessMap = getTexture( json.iridescenceThicknessMap );\n\n\t\tif ( json.transmissionMap !== undefined ) material.transmissionMap = getTexture( json.transmissionMap );\n\t\tif ( json.thicknessMap !== undefined ) material.thicknessMap = getTexture( json.thicknessMap );\n\n\t\tif ( json.anisotropyMap !== undefined ) material.anisotropyMap = getTexture( json.anisotropyMap );\n\n\t\tif ( json.sheenColorMap !== undefined ) material.sheenColorMap = getTexture( json.sheenColorMap );\n\t\tif ( json.sheenRoughnessMap !== undefined ) material.sheenRoughnessMap = getTexture( json.sheenRoughnessMap );\n\n\t\treturn material;\n\n\t}\n\n\tsetTextures( value ) {\n\n\t\tthis.textures = value;\n\t\treturn this;\n\n\t}\n\n\tstatic createMaterialFromType( type ) {\n\n\t\tconst materialLib = {\n\t\t\tShadowMaterial,\n\t\t\tSpriteMaterial,\n\t\t\tRawShaderMaterial,\n\t\t\tShaderMaterial,\n\t\t\tPointsMaterial,\n\t\t\tMeshPhysicalMaterial,\n\t\t\tMeshStandardMaterial,\n\t\t\tMeshPhongMaterial,\n\t\t\tMeshToonMaterial,\n\t\t\tMeshNormalMaterial,\n\t\t\tMeshLambertMaterial,\n\t\t\tMeshDepthMaterial,\n\t\t\tMeshDistanceMaterial,\n\t\t\tMeshBasicMaterial,\n\t\t\tMeshMatcapMaterial,\n\t\t\tLineDashedMaterial,\n\t\t\tLineBasicMaterial,\n\t\t\tMaterial\n\t\t};\n\n\t\treturn new materialLib[ type ]();\n\n\t}\n\n}\n\nclass LoaderUtils {\n\n\tstatic decodeText( 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\tlet s = '';\n\n\t\tfor ( let 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\ttry {\n\n\t\t\t// merges multi-byte utf-8 characters.\n\n\t\t\treturn decodeURIComponent( escape( s ) );\n\n\t\t} catch ( e ) { // see #16358\n\n\t\t\treturn s;\n\n\t\t}\n\n\t}\n\n\tstatic extractUrlBase( url ) {\n\n\t\tconst index = url.lastIndexOf( '/' );\n\n\t\tif ( index === - 1 ) return './';\n\n\t\treturn url.slice( 0, index + 1 );\n\n\t}\n\n\tstatic resolveURL( url, path ) {\n\n\t\t// Invalid URL\n\t\tif ( typeof url !== 'string' || url === '' ) return '';\n\n\t\t// Host Relative URL\n\t\tif ( /^https?:\\/\\//i.test( path ) && /^\\//.test( url ) ) {\n\n\t\t\tpath = path.replace( /(^https?:\\/\\/[^\\/]+).*/i, '$1' );\n\n\t\t}\n\n\t\t// Absolute URL http://,https://,//\n\t\tif ( /^(https?:)?\\/\\//i.test( url ) ) return url;\n\n\t\t// Data URI\n\t\tif ( /^data:.*,.*$/i.test( url ) ) return url;\n\n\t\t// Blob URL\n\t\tif ( /^blob:.*$/i.test( url ) ) return url;\n\n\t\t// Relative URL\n\t\treturn path + url;\n\n\t}\n\n}\n\nclass InstancedBufferGeometry extends BufferGeometry {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isInstancedBufferGeometry = true;\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\t\tthis.instanceCount = Infinity;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.instanceCount = source.instanceCount;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.instanceCount = this.instanceCount;\n\n\t\tdata.isInstancedBufferGeometry = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass BufferGeometryLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\tconst interleavedBufferMap = {};\n\t\tconst arrayBufferMap = {};\n\n\t\tfunction getInterleavedBuffer( json, uuid ) {\n\n\t\t\tif ( interleavedBufferMap[ uuid ] !== undefined ) return interleavedBufferMap[ uuid ];\n\n\t\t\tconst interleavedBuffers = json.interleavedBuffers;\n\t\t\tconst interleavedBuffer = interleavedBuffers[ uuid ];\n\n\t\t\tconst buffer = getArrayBuffer( json, interleavedBuffer.buffer );\n\n\t\t\tconst array = getTypedArray( interleavedBuffer.type, buffer );\n\t\t\tconst ib = new InterleavedBuffer( array, interleavedBuffer.stride );\n\t\t\tib.uuid = interleavedBuffer.uuid;\n\n\t\t\tinterleavedBufferMap[ uuid ] = ib;\n\n\t\t\treturn ib;\n\n\t\t}\n\n\t\tfunction getArrayBuffer( json, uuid ) {\n\n\t\t\tif ( arrayBufferMap[ uuid ] !== undefined ) return arrayBufferMap[ uuid ];\n\n\t\t\tconst arrayBuffers = json.arrayBuffers;\n\t\t\tconst arrayBuffer = arrayBuffers[ uuid ];\n\n\t\t\tconst ab = new Uint32Array( arrayBuffer ).buffer;\n\n\t\t\tarrayBufferMap[ uuid ] = ab;\n\n\t\t\treturn ab;\n\n\t\t}\n\n\t\tconst geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry();\n\n\t\tconst index = json.data.index;\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst typedArray = getTypedArray( index.type, index.array );\n\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t}\n\n\t\tconst attributes = json.data.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\t\t\tlet bufferAttribute;\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t} else {\n\n\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\tconst bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute;\n\t\t\t\tbufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t}\n\n\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\tif ( attribute.usage !== undefined ) bufferAttribute.setUsage( attribute.usage );\n\n\t\t\tif ( attribute.updateRange !== undefined ) {\n\n\t\t\t\tbufferAttribute.updateRange.offset = attribute.updateRange.offset;\n\t\t\t\tbufferAttribute.updateRange.count = attribute.updateRange.count;\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( key, bufferAttribute );\n\n\t\t}\n\n\t\tconst morphAttributes = json.data.morphAttributes;\n\n\t\tif ( morphAttributes ) {\n\n\t\t\tfor ( const key in morphAttributes ) {\n\n\t\t\t\tconst attributeArray = morphAttributes[ key ];\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attribute = attributeArray[ i ];\n\t\t\t\t\tlet bufferAttribute;\n\n\t\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\t\t\tbufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\t\t\tarray.push( bufferAttribute );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.morphAttributes[ key ] = array;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst morphTargetsRelative = json.data.morphTargetsRelative;\n\n\t\tif ( morphTargetsRelative ) {\n\n\t\t\tgeometry.morphTargetsRelative = true;\n\n\t\t}\n\n\t\tconst groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\tif ( groups !== undefined ) {\n\n\t\t\tfor ( let i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\tconst 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\tconst boundingSphere = json.data.boundingSphere;\n\n\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\tconst 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\tif ( json.name ) geometry.name = json.name;\n\t\tif ( json.userData ) geometry.userData = json.userData;\n\n\t\treturn geometry;\n\n\t}\n\n}\n\nclass ObjectLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tlet 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\tconst metadata = json.metadata;\n\n\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( new Error( 'THREE.ObjectLoader: Can\\'t load ' + url ) );\n\n\t\t\t\tconsole.error( 'THREE.ObjectLoader: Can\\'t load ' + url );\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\tasync loadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tconst text = await loader.loadAsync( url, onProgress );\n\n\t\tconst json = JSON.parse( text );\n\n\t\tconst metadata = json.metadata;\n\n\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\tthrow new Error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\n\t\t}\n\n\t\treturn await scope.parseAsync( json );\n\n\t}\n\n\tparse( json, onLoad ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = this.parseImages( json.images, function () {\n\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t} );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\n\t\t//\n\n\t\tif ( onLoad !== undefined ) {\n\n\t\t\tlet hasImages = false;\n\n\t\t\tfor ( const uuid in images ) {\n\n\t\t\t\tif ( images[ uuid ].data instanceof HTMLImageElement ) {\n\n\t\t\t\t\thasImages = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasImages === false ) onLoad( object );\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\tasync parseAsync( json ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = await this.parseImagesAsync( json.images );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\n\t\treturn object;\n\n\t}\n\n\tparseShapes( json ) {\n\n\t\tconst shapes = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst 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\tparseSkeletons( json, object ) {\n\n\t\tconst skeletons = {};\n\t\tconst bones = {};\n\n\t\t// generate bone lookup table\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isBone ) bones[ child.uuid ] = child;\n\n\t\t} );\n\n\t\t// create skeletons\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst skeleton = new Skeleton().fromJSON( json[ i ], bones );\n\n\t\t\t\tskeletons[ skeleton.uuid ] = skeleton;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn skeletons;\n\n\t}\n\n\tparseGeometries( json, shapes ) {\n\n\t\tconst geometries = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tlet geometry;\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'BufferGeometry':\n\t\t\t\t\tcase 'InstancedBufferGeometry':\n\n\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( data.type in Geometries ) {\n\n\t\t\t\t\t\t\tgeometry = Geometries[ data.type ].fromJSON( data, shapes );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.warn( `THREE.ObjectLoader: Unsupported geometry type \"${ data.type }\"` );\n\n\t\t\t\t\t\t}\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\t\t\t\tif ( data.userData !== undefined ) geometry.userData = data.userData;\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( json, textures ) {\n\n\t\tconst cache = {}; // MultiMaterial\n\t\tconst materials = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst loader = new MaterialLoader();\n\t\t\tloader.setTextures( textures );\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( cache[ data.uuid ] === undefined ) {\n\n\t\t\t\t\tcache[ data.uuid ] = loader.parse( data );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials[ data.uuid ] = cache[ data.uuid ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materials;\n\n\t}\n\n\tparseAnimations( json ) {\n\n\t\tconst animations = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tconst clip = AnimationClip.parse( data );\n\n\t\t\t\tanimations[ clip.uuid ] = clip;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n\tparseImages( json, onLoad ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\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.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tfunction deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn loadImage( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tconst manager = new LoadingManager( onLoad );\n\n\t\t\tloader = new ImageLoader( manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\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\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tasync parseImagesAsync( json ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tasync function deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn await loader.loadAsync( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tloader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = await deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\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\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = await deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tparseTextures( 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\tconst textures = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst 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\tconst source = images[ data.image ];\n\t\t\t\tconst image = source.data;\n\n\t\t\t\tlet texture;\n\n\t\t\t\tif ( Array.isArray( image ) ) {\n\n\t\t\t\t\ttexture = new CubeTexture();\n\n\t\t\t\t\tif ( image.length === 6 ) texture.needsUpdate = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( image && image.data ) {\n\n\t\t\t\t\t\ttexture = new DataTexture();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture = new Texture();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( image ) texture.needsUpdate = true; // textures can have undefined image data\n\n\t\t\t\t}\n\n\t\t\t\ttexture.source = source;\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\t\t\t\tif ( data.channel !== undefined ) texture.channel = data.channel;\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\t\t\t\tif ( data.internalFormat !== undefined ) texture.internalFormat = data.internalFormat;\n\t\t\t\tif ( data.type !== undefined ) texture.type = data.type;\n\t\t\t\tif ( data.colorSpace !== undefined ) texture.colorSpace = data.colorSpace;\n\t\t\t\tif ( data.encoding !== undefined ) texture.encoding = data.encoding; // @deprecated, r152\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\tif ( data.generateMipmaps !== undefined ) texture.generateMipmaps = data.generateMipmaps;\n\t\t\t\tif ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha;\n\t\t\t\tif ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment;\n\t\t\t\tif ( data.compareFunction !== undefined ) texture.compareFunction = data.compareFunction;\n\n\t\t\t\tif ( data.userData !== undefined ) texture.userData = data.userData;\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( data, geometries, materials, textures, animations ) {\n\n\t\tlet 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\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, l = name.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst 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\tfunction getTexture( uuid ) {\n\n\t\t\tif ( textures[ uuid ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined texture', uuid );\n\n\t\t\t}\n\n\t\t\treturn textures[ uuid ];\n\n\t\t}\n\n\t\tlet geometry, material;\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} else {\n\n\t\t\t\t\t\tobject.background = getTexture( data.background );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.environment !== undefined ) {\n\n\t\t\t\t\tobject.environment = getTexture( data.environment );\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\tif ( data.fog.name !== '' ) {\n\n\t\t\t\t\t\tobject.fog.name = data.fog.name;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.backgroundBlurriness !== undefined ) object.backgroundBlurriness = data.backgroundBlurriness;\n\t\t\t\tif ( data.backgroundIntensity !== undefined ) object.backgroundIntensity = data.backgroundIntensity;\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 'LightProbe':\n\n\t\t\t\tobject = new LightProbe().fromJSON( data );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t \tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\tif ( data.bindMode !== undefined ) object.bindMode = data.bindMode;\n\t\t\t\tif ( data.bindMatrix !== undefined ) object.bindMatrix.fromArray( data.bindMatrix );\n\t\t\t\tif ( data.skeleton !== undefined ) object.skeleton = data.skeleton;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Mesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'InstancedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\t\t\t\tconst count = data.count;\n\t\t\t\tconst instanceMatrix = data.instanceMatrix;\n\t\t\t\tconst instanceColor = data.instanceColor;\n\n\t\t\t\tobject = new InstancedMesh( geometry, material, count );\n\t\t\t\tobject.instanceMatrix = new InstancedBufferAttribute( new Float32Array( instanceMatrix.array ), 16 );\n\t\t\t\tif ( instanceColor !== undefined ) object.instanceColor = new InstancedBufferAttribute( new Float32Array( instanceColor.array ), instanceColor.itemSize );\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 ) );\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\tcase 'Bone':\n\n\t\t\t\tobject = new Bone();\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.up !== undefined ) object.up.fromArray( data.up );\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.normalBias !== undefined ) object.shadow.normalBias = data.shadow.normalBias;\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\t\tif ( data.layers !== undefined ) object.layers.mask = data.layers;\n\n\t\tif ( data.children !== undefined ) {\n\n\t\t\tconst children = data.children;\n\n\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tobject.add( this.parseObject( children[ i ], geometries, materials, textures, animations ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.animations !== undefined ) {\n\n\t\t\tconst objectAnimations = data.animations;\n\n\t\t\tfor ( let i = 0; i < objectAnimations.length; i ++ ) {\n\n\t\t\t\tconst uuid = objectAnimations[ i ];\n\n\t\t\t\tobject.animations.push( animations[ uuid ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.type === 'LOD' ) {\n\n\t\t\tif ( data.autoUpdate !== undefined ) object.autoUpdate = data.autoUpdate;\n\n\t\t\tconst levels = data.levels;\n\n\t\t\tfor ( let l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tconst level = levels[ l ];\n\t\t\t\tconst 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, level.hysteresis );\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\tbindSkeletons( object, skeletons ) {\n\n\t\tif ( Object.keys( skeletons ).length === 0 ) return;\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isSkinnedMesh === true && child.skeleton !== undefined ) {\n\n\t\t\t\tconst skeleton = skeletons[ child.skeleton ];\n\n\t\t\t\tif ( skeleton === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No skeleton found with UUID:', child.skeleton );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.bind( skeleton, child.bindMatrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n}\n\nconst TEXTURE_MAPPING = {\n\tUVMapping: UVMapping,\n\tCubeReflectionMapping: CubeReflectionMapping,\n\tCubeRefractionMapping: CubeRefractionMapping,\n\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\tCubeUVReflectionMapping: CubeUVReflectionMapping\n};\n\nconst TEXTURE_WRAPPING = {\n\tRepeatWrapping: RepeatWrapping,\n\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\tMirroredRepeatWrapping: MirroredRepeatWrapping\n};\n\nconst TEXTURE_FILTER = {\n\tNearestFilter: NearestFilter,\n\tNearestMipmapNearestFilter: NearestMipmapNearestFilter,\n\tNearestMipmapLinearFilter: NearestMipmapLinearFilter,\n\tLinearFilter: LinearFilter,\n\tLinearMipmapNearestFilter: LinearMipmapNearestFilter,\n\tLinearMipmapLinearFilter: LinearMipmapLinearFilter\n};\n\nclass ImageBitmapLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.isImageBitmapLoader = true;\n\n\t\tif ( typeof createImageBitmap === 'undefined' ) {\n\n\t\t\tconsole.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' );\n\n\t\t}\n\n\t\tif ( typeof fetch === 'undefined' ) {\n\n\t\t\tconsole.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' );\n\n\t\t}\n\n\t\tthis.options = { premultiplyAlpha: 'none' };\n\n\t}\n\n\tsetOptions( options ) {\n\n\t\tthis.options = options;\n\n\t\treturn this;\n\n\t}\n\n\tload( 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\tconst scope = this;\n\n\t\tconst 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\tconst fetchOptions = {};\n\t\tfetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include';\n\t\tfetchOptions.headers = this.requestHeader;\n\n\t\tfetch( url, fetchOptions ).then( function ( res ) {\n\n\t\t\treturn res.blob();\n\n\t\t} ).then( function ( blob ) {\n\n\t\t\treturn createImageBitmap( blob, Object.assign( scope.options, { colorSpaceConversion: 'none' } ) );\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.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} );\n\n\t\tscope.manager.itemStart( url );\n\n\t}\n\n}\n\nlet _context;\n\nclass AudioContext {\n\n\tstatic getContext() {\n\n\t\tif ( _context === undefined ) {\n\n\t\t\t_context = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn _context;\n\n\t}\n\n\tstatic setContext( value ) {\n\n\t\t_context = value;\n\n\t}\n\n}\n\nclass AudioLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\t// Create a copy of the buffer. The `decodeAudioData` method\n\t\t\t\t// detaches the buffer when complete, preventing reuse.\n\t\t\t\tconst bufferCopy = buffer.slice( 0 );\n\n\t\t\t\tconst context = AudioContext.getContext();\n\t\t\t\tcontext.decodeAudioData( bufferCopy, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t}, handleError );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\thandleError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\tfunction handleError( e ) {\n\n\t\t\tif ( onError ) {\n\n\t\t\t\tonError( e );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\n\t\t}\n\n\t}\n\n}\n\nconst _eyeRight = /*@__PURE__*/ new Matrix4();\nconst _eyeLeft = /*@__PURE__*/ new Matrix4();\nconst _projectionMatrix = /*@__PURE__*/ new Matrix4();\n\nclass StereoCamera {\n\n\tconstructor() {\n\n\t\tthis.type = 'StereoCamera';\n\n\t\tthis.aspect = 1;\n\n\t\tthis.eyeSep = 0.064;\n\n\t\tthis.cameraL = new PerspectiveCamera();\n\t\tthis.cameraL.layers.enable( 1 );\n\t\tthis.cameraL.matrixAutoUpdate = false;\n\n\t\tthis.cameraR = new PerspectiveCamera();\n\t\tthis.cameraR.layers.enable( 2 );\n\t\tthis.cameraR.matrixAutoUpdate = false;\n\n\t\tthis._cache = {\n\t\t\tfocus: null,\n\t\t\tfov: null,\n\t\t\taspect: null,\n\t\t\tnear: null,\n\t\t\tfar: null,\n\t\t\tzoom: null,\n\t\t\teyeSep: null\n\t\t};\n\n\t}\n\n\tupdate( camera ) {\n\n\t\tconst cache = this._cache;\n\n\t\tconst needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov ||\n\t\t\tcache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near ||\n\t\t\tcache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep;\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tcache.focus = camera.focus;\n\t\t\tcache.fov = camera.fov;\n\t\t\tcache.aspect = camera.aspect * this.aspect;\n\t\t\tcache.near = camera.near;\n\t\t\tcache.far = camera.far;\n\t\t\tcache.zoom = camera.zoom;\n\t\t\tcache.eyeSep = this.eyeSep;\n\n\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t_projectionMatrix.copy( camera.projectionMatrix );\n\t\t\tconst eyeSepHalf = cache.eyeSep / 2;\n\t\t\tconst eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus;\n\t\t\tconst ymax = ( cache.near * Math.tan( DEG2RAD * cache.fov * 0.5 ) ) / cache.zoom;\n\t\t\tlet xmin, xmax;\n\n\t\t\t// translate xOffset\n\n\t\t\t_eyeLeft.elements[ 12 ] = - eyeSepHalf;\n\t\t\t_eyeRight.elements[ 12 ] = eyeSepHalf;\n\n\t\t\t// for left eye\n\n\t\t\txmin = - ymax * cache.aspect + eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect + eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraL.projectionMatrix.copy( _projectionMatrix );\n\n\t\t\t// for right eye\n\n\t\t\txmin = - ymax * cache.aspect - eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect - eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraR.projectionMatrix.copy( _projectionMatrix );\n\n\t\t}\n\n\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeLeft );\n\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeRight );\n\n\t}\n\n}\n\nclass Clock {\n\n\tconstructor( autoStart = true ) {\n\n\t\tthis.autoStart = autoStart;\n\n\t\tthis.startTime = 0;\n\t\tthis.oldTime = 0;\n\t\tthis.elapsedTime = 0;\n\n\t\tthis.running = false;\n\n\t}\n\n\tstart() {\n\n\t\tthis.startTime = now();\n\n\t\tthis.oldTime = this.startTime;\n\t\tthis.elapsedTime = 0;\n\t\tthis.running = true;\n\n\t}\n\n\tstop() {\n\n\t\tthis.getElapsedTime();\n\t\tthis.running = false;\n\t\tthis.autoStart = false;\n\n\t}\n\n\tgetElapsedTime() {\n\n\t\tthis.getDelta();\n\t\treturn this.elapsedTime;\n\n\t}\n\n\tgetDelta() {\n\n\t\tlet 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\tconst newTime = 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\nfunction now() {\n\n\treturn ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732\n\n}\n\nconst _position$1 = /*@__PURE__*/ new Vector3();\nconst _quaternion$1 = /*@__PURE__*/ new Quaternion();\nconst _scale$1 = /*@__PURE__*/ new Vector3();\nconst _orientation$1 = /*@__PURE__*/ new Vector3();\n\nclass AudioListener extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'AudioListener';\n\n\t\tthis.context = AudioContext.getContext();\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( this.context.destination );\n\n\t\tthis.filter = null;\n\n\t\tthis.timeDelta = 0;\n\n\t\t// private\n\n\t\tthis._clock = new Clock();\n\n\t}\n\n\tgetInput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\tremoveFilter() {\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\treturn this;\n\n\t}\n\n\tgetFilter() {\n\n\t\treturn this.filter;\n\n\t}\n\n\tsetFilter( 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\treturn this;\n\n\t}\n\n\tgetMasterVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\tsetMasterVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tconst listener = this.context.listener;\n\t\tconst up = this.up;\n\n\t\tthis.timeDelta = this._clock.getDelta();\n\n\t\tthis.matrixWorld.decompose( _position$1, _quaternion$1, _scale$1 );\n\n\t\t_orientation$1.set( 0, 0, - 1 ).applyQuaternion( _quaternion$1 );\n\n\t\tif ( listener.positionX ) {\n\n\t\t\t// code path for Chrome (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.timeDelta;\n\n\t\t\tlistener.positionX.linearRampToValueAtTime( _position$1.x, endTime );\n\t\t\tlistener.positionY.linearRampToValueAtTime( _position$1.y, endTime );\n\t\t\tlistener.positionZ.linearRampToValueAtTime( _position$1.z, endTime );\n\t\t\tlistener.forwardX.linearRampToValueAtTime( _orientation$1.x, endTime );\n\t\t\tlistener.forwardY.linearRampToValueAtTime( _orientation$1.y, endTime );\n\t\t\tlistener.forwardZ.linearRampToValueAtTime( _orientation$1.z, endTime );\n\t\t\tlistener.upX.linearRampToValueAtTime( up.x, endTime );\n\t\t\tlistener.upY.linearRampToValueAtTime( up.y, endTime );\n\t\t\tlistener.upZ.linearRampToValueAtTime( up.z, endTime );\n\n\t\t} else {\n\n\t\t\tlistener.setPosition( _position$1.x, _position$1.y, _position$1.z );\n\t\t\tlistener.setOrientation( _orientation$1.x, _orientation$1.y, _orientation$1.z, up.x, up.y, up.z );\n\n\t\t}\n\n\t}\n\n}\n\nclass Audio extends Object3D {\n\n\tconstructor( listener ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Audio';\n\n\t\tthis.listener = listener;\n\t\tthis.context = listener.context;\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( listener.getInput() );\n\n\t\tthis.autoplay = false;\n\n\t\tthis.buffer = null;\n\t\tthis.detune = 0;\n\t\tthis.loop = false;\n\t\tthis.loopStart = 0;\n\t\tthis.loopEnd = 0;\n\t\tthis.offset = 0;\n\t\tthis.duration = undefined;\n\t\tthis.playbackRate = 1;\n\t\tthis.isPlaying = false;\n\t\tthis.hasPlaybackControl = true;\n\t\tthis.source = null;\n\t\tthis.sourceType = 'empty';\n\n\t\tthis._startedAt = 0;\n\t\tthis._progress = 0;\n\t\tthis._connected = false;\n\n\t\tthis.filters = [];\n\n\t}\n\n\tgetOutput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\tsetNodeSource( 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\tsetMediaElementSource( mediaElement ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaNode';\n\t\tthis.source = this.context.createMediaElementSource( mediaElement );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\tsetMediaStreamSource( mediaStream ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaStreamNode';\n\t\tthis.source = this.context.createMediaStreamSource( mediaStream );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\tsetBuffer( 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( delay = 0 ) {\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\tthis._startedAt = this.context.currentTime + delay;\n\n\t\tconst source = this.context.createBufferSource();\n\t\tsource.buffer = this.buffer;\n\t\tsource.loop = this.loop;\n\t\tsource.loopStart = this.loopStart;\n\t\tsource.loopEnd = this.loopEnd;\n\t\tsource.onended = this.onEnded.bind( this );\n\t\tsource.start( this._startedAt, this._progress + this.offset, this.duration );\n\n\t\tthis.isPlaying = true;\n\n\t\tthis.source = source;\n\n\t\tthis.setDetune( this.detune );\n\t\tthis.setPlaybackRate( this.playbackRate );\n\n\t\treturn this.connect();\n\n\t}\n\n\tpause() {\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\t// update current progress\n\n\t\t\tthis._progress += Math.max( this.context.currentTime - this._startedAt, 0 ) * this.playbackRate;\n\n\t\t\tif ( this.loop === true ) {\n\n\t\t\t\t// ensure _progress does not exceed duration with looped audios\n\n\t\t\t\tthis._progress = this._progress % ( this.duration || this.buffer.duration );\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.source.onended = null;\n\n\t\t\tthis.isPlaying = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tstop() {\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._progress = 0;\n\n\t\tif ( this.source !== null ) {\n\n\t\t\tthis.source.stop();\n\t\t\tthis.source.onended = null;\n\n\t\t}\n\n\t\tthis.isPlaying = false;\n\n\t\treturn this;\n\n\t}\n\n\tconnect() {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\tfor ( let 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\tthis._connected = true;\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect() {\n\n\t\tif ( this._connected === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\tfor ( let 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\tthis._connected = false;\n\n\t\treturn this;\n\n\t}\n\n\tgetFilters() {\n\n\t\treturn this.filters;\n\n\t}\n\n\tsetFilters( value ) {\n\n\t\tif ( ! value ) value = [];\n\n\t\tif ( this._connected === true ) {\n\n\t\t\tthis.disconnect();\n\t\t\tthis.filters = value.slice();\n\t\t\tthis.connect();\n\n\t\t} else {\n\n\t\t\tthis.filters = value.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetDetune( value ) {\n\n\t\tthis.detune = value;\n\n\t\tif ( this.source.detune === undefined ) return; // only set detune when available\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetDetune() {\n\n\t\treturn this.detune;\n\n\t}\n\n\tgetFilter() {\n\n\t\treturn this.getFilters()[ 0 ];\n\n\t}\n\n\tsetFilter( filter ) {\n\n\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t}\n\n\tsetPlaybackRate( 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.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetPlaybackRate() {\n\n\t\treturn this.playbackRate;\n\n\t}\n\n\tonEnded() {\n\n\t\tthis.isPlaying = false;\n\n\t}\n\n\tgetLoop() {\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( 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\tsetLoopStart( value ) {\n\n\t\tthis.loopStart = value;\n\n\t\treturn this;\n\n\t}\n\n\tsetLoopEnd( value ) {\n\n\t\tthis.loopEnd = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\tsetVolume( 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\nconst _position = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\nconst _scale = /*@__PURE__*/ new Vector3();\nconst _orientation = /*@__PURE__*/ new Vector3();\n\nclass PositionalAudio extends Audio {\n\n\tconstructor( listener ) {\n\n\t\tsuper( listener );\n\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.panningModel = 'HRTF';\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tconnect() {\n\n\t\tsuper.connect();\n\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tdisconnect() {\n\n\t\tsuper.disconnect();\n\n\t\tthis.panner.disconnect( this.gain );\n\n\t}\n\n\tgetOutput() {\n\n\t\treturn this.panner;\n\n\t}\n\n\tgetRefDistance() {\n\n\t\treturn this.panner.refDistance;\n\n\t}\n\n\tsetRefDistance( value ) {\n\n\t\tthis.panner.refDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetRolloffFactor() {\n\n\t\treturn this.panner.rolloffFactor;\n\n\t}\n\n\tsetRolloffFactor( value ) {\n\n\t\tthis.panner.rolloffFactor = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetDistanceModel() {\n\n\t\treturn this.panner.distanceModel;\n\n\t}\n\n\tsetDistanceModel( value ) {\n\n\t\tthis.panner.distanceModel = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetMaxDistance() {\n\n\t\treturn this.panner.maxDistance;\n\n\t}\n\n\tsetMaxDistance( value ) {\n\n\t\tthis.panner.maxDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\tsetDirectionalCone( coneInnerAngle, coneOuterAngle, coneOuterGain ) {\n\n\t\tthis.panner.coneInnerAngle = coneInnerAngle;\n\t\tthis.panner.coneOuterAngle = coneOuterAngle;\n\t\tthis.panner.coneOuterGain = coneOuterGain;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.hasPlaybackControl === true && this.isPlaying === false ) return;\n\n\t\tthis.matrixWorld.decompose( _position, _quaternion, _scale );\n\n\t\t_orientation.set( 0, 0, 1 ).applyQuaternion( _quaternion );\n\n\t\tconst panner = this.panner;\n\n\t\tif ( panner.positionX ) {\n\n\t\t\t// code path for Chrome and Firefox (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.listener.timeDelta;\n\n\t\t\tpanner.positionX.linearRampToValueAtTime( _position.x, endTime );\n\t\t\tpanner.positionY.linearRampToValueAtTime( _position.y, endTime );\n\t\t\tpanner.positionZ.linearRampToValueAtTime( _position.z, endTime );\n\t\t\tpanner.orientationX.linearRampToValueAtTime( _orientation.x, endTime );\n\t\t\tpanner.orientationY.linearRampToValueAtTime( _orientation.y, endTime );\n\t\t\tpanner.orientationZ.linearRampToValueAtTime( _orientation.z, endTime );\n\n\t\t} else {\n\n\t\t\tpanner.setPosition( _position.x, _position.y, _position.z );\n\t\t\tpanner.setOrientation( _orientation.x, _orientation.y, _orientation.z );\n\n\t\t}\n\n\t}\n\n}\n\nclass AudioAnalyser {\n\n\tconstructor( audio, fftSize = 2048 ) {\n\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize;\n\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\n\tgetFrequencyData() {\n\n\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\treturn this.data;\n\n\t}\n\n\tgetAverageFrequency() {\n\n\t\tlet value = 0;\n\t\tconst data = this.getFrequencyData();\n\n\t\tfor ( let 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\nclass PropertyMixer {\n\n\tconstructor( binding, typeName, valueSize ) {\n\n\t\tthis.binding = binding;\n\t\tthis.valueSize = valueSize;\n\n\t\tlet mixFunction,\n\t\t\tmixFunctionAdditive,\n\t\t\tsetIdentity;\n\n\t\t// buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ]\n\t\t//\n\t\t// interpolators can use .buffer as their .result\n\t\t// the data then goes to 'incoming'\n\t\t//\n\t\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t\t// the cumulative result and are compared to detect\n\t\t// changes\n\t\t//\n\t\t// 'orig' stores the original state of the property\n\t\t//\n\t\t// 'add' is used for additive cumulative results\n\t\t//\n\t\t// 'work' is optional and is only present for quaternion types. It is used\n\t\t// to store intermediate quaternion multiplication results\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = this._slerp;\n\t\t\t\tmixFunctionAdditive = this._slerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityQuaternion;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 6 );\n\t\t\t\tthis._workIndex = 5;\n\t\t\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tmixFunction = this._select;\n\n\t\t\t\t// Use the regular mix function and for additive on these types,\n\t\t\t\t// additive is not relevant for non-numeric types\n\t\t\t\tmixFunctionAdditive = this._select;\n\n\t\t\t\tsetIdentity = this._setAdditiveIdentityOther;\n\n\t\t\t\tthis.buffer = new Array( valueSize * 5 );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tmixFunction = this._lerp;\n\t\t\t\tmixFunctionAdditive = this._lerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityNumeric;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 5 );\n\n\t\t}\n\n\t\tthis._mixBufferRegion = mixFunction;\n\t\tthis._mixBufferRegionAdditive = mixFunctionAdditive;\n\t\tthis._setIdentity = setIdentity;\n\t\tthis._origIndex = 3;\n\t\tthis._addIndex = 4;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tthis.useCount = 0;\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\t// accumulate data in the 'incoming' region into 'accu<i>'\n\taccumulate( 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\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = accuIndex * stride + stride;\n\n\t\tlet currentWeight = this.cumulativeWeight;\n\n\t\tif ( currentWeight === 0 ) {\n\n\t\t\t// accuN := incoming * weight\n\n\t\t\tfor ( let 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\tconst 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// accumulate data in the 'incoming' region into 'add'\n\taccumulateAdditive( weight ) {\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = stride * this._addIndex;\n\n\t\tif ( this.cumulativeWeightAdditive === 0 ) {\n\n\t\t\t// add = identity\n\n\t\t\tthis._setIdentity();\n\n\t\t}\n\n\t\t// add := add + incoming * weight\n\n\t\tthis._mixBufferRegionAdditive( buffer, offset, 0, weight, stride );\n\t\tthis.cumulativeWeightAdditive += weight;\n\n\t}\n\n\t// apply the state of 'accu<i>' to the binding when accus differ\n\tapply( accuIndex ) {\n\n\t\tconst stride = this.valueSize,\n\t\t\tbuffer = this.buffer,\n\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\tweight = this.cumulativeWeight,\n\t\t\tweightAdditive = this.cumulativeWeightAdditive,\n\n\t\t\tbinding = this.binding;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tif ( weight < 1 ) {\n\n\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\tconst originalValueOffset = stride * this._origIndex;\n\n\t\t\tthis._mixBufferRegion(\n\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t}\n\n\t\tif ( weightAdditive > 0 ) {\n\n\t\t\t// accuN := accuN + additive accuN\n\n\t\t\tthis._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride );\n\n\t\t}\n\n\t\tfor ( let 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() {\n\n\t\tconst binding = this.binding;\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\n\t\t\toriginalValueOffset = stride * this._origIndex;\n\n\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\tfor ( let i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t}\n\n\t\t// Add to identity for additive\n\t\tthis._setIdentity();\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t}\n\n\t// apply the state previously taken via 'saveOriginalState' to the binding\n\trestoreOriginalState() {\n\n\t\tconst originalValueOffset = this.valueSize * 3;\n\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t}\n\n\t_setAdditiveIdentityNumeric() {\n\n\t\tconst startIndex = this._addIndex * this.valueSize;\n\t\tconst endIndex = startIndex + this.valueSize;\n\n\t\tfor ( let i = startIndex; i < endIndex; i ++ ) {\n\n\t\t\tthis.buffer[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\t_setAdditiveIdentityQuaternion() {\n\n\t\tthis._setAdditiveIdentityNumeric();\n\t\tthis.buffer[ this._addIndex * this.valueSize + 3 ] = 1;\n\n\t}\n\n\t_setAdditiveIdentityOther() {\n\n\t\tconst startIndex = this._origIndex * this.valueSize;\n\t\tconst targetIndex = this._addIndex * this.valueSize;\n\n\t\tfor ( let i = 0; i < this.valueSize; i ++ ) {\n\n\t\t\tthis.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ];\n\n\t\t}\n\n\t}\n\n\n\t// mix functions\n\n\t_select( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tif ( t >= 0.5 ) {\n\n\t\t\tfor ( let 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( buffer, dstOffset, srcOffset, t ) {\n\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );\n\n\t}\n\n\t_slerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst workOffset = this._workIndex * stride;\n\n\t\t// Store result in intermediate buffer offset\n\t\tQuaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset );\n\n\t\t// Slerp to the intermediate result\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t );\n\n\t}\n\n\t_lerp( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst s = 1 - t;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst 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\t_lerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n}\n\n// Characters [].:/ are reserved for track binding syntax.\nconst _RESERVED_CHARS_RE = '\\\\[\\\\]\\\\.:\\\\/';\nconst _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' );\n\n// Attempts to allow node names from any language. ES5's `\\w` regexp matches\n// only latin characters, and the unicode \\p{L} is not yet supported. So\n// instead, we exclude reserved characters and match everything else.\nconst _wordChar = '[^' + _RESERVED_CHARS_RE + ']';\nconst _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\\\.', '' ) + ']';\n\n// Parent directories, delimited by '/' or ':'. Currently unused, but must\n// be matched to parse the rest of the track name.\nconst _directoryRe = /*@__PURE__*/ /((?:WC+[\\/:])*)/.source.replace( 'WC', _wordChar );\n\n// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.\nconst _nodeRe = /*@__PURE__*/ /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot );\n\n// Object on target node, and accessor. May not contain reserved\n// characters. Accessor may contain any character except closing bracket.\nconst _objectRe = /*@__PURE__*/ /(?:\\.(WC+)(?:\\[(.+)\\])?)?/.source.replace( 'WC', _wordChar );\n\n// Property and accessor. May not contain reserved characters. Accessor may\n// contain any non-bracket characters.\nconst _propertyRe = /*@__PURE__*/ /\\.(WC+)(?:\\[(.+)\\])?/.source.replace( 'WC', _wordChar );\n\nconst _trackRe = new RegExp( ''\n\t+ '^'\n\t+ _directoryRe\n\t+ _nodeRe\n\t+ _objectRe\n\t+ _propertyRe\n\t+ '$'\n);\n\nconst _supportedObjectNames = [ 'material', 'materials', 'bones', 'map' ];\n\nclass Composite {\n\n\tconstructor( targetGroup, path, optionalParsedPath ) {\n\n\t\tconst parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t}\n\n\tgetValue( array, offset ) {\n\n\t\tthis.bind(); // bind all binding\n\n\t\tconst 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( array, offset ) {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, 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() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].bind();\n\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].unbind();\n\n\t\t}\n\n\t}\n\n}\n\n// Note: This class uses a State pattern on a per-method basis:\n// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n// prototype version of these methods with one that represents\n// the bound state. When the property is not found, the methods\n// become no-ops.\nclass PropertyBinding {\n\n\tconstructor( rootNode, path, parsedPath ) {\n\n\t\tthis.path = path;\n\t\tthis.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName );\n\n\t\tthis.rootNode = rootNode;\n\n\t\t// initial state of these methods that calls 'bind'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n\n\tstatic create( 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\tstatic sanitizeNodeName( name ) {\n\n\t\treturn name.replace( /\\s/g, '_' ).replace( _reservedRe, '' );\n\n\t}\n\n\tstatic parseTrackName( trackName ) {\n\n\t\tconst matches = _trackRe.exec( trackName );\n\n\t\tif ( matches === null ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );\n\n\t\t}\n\n\t\tconst results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ],\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ], // required\n\t\t\tpropertyIndex: matches[ 6 ]\n\t\t};\n\n\t\tconst lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );\n\n\t\tif ( lastDot !== undefined && lastDot !== - 1 ) {\n\n\t\t\tconst objectName = results.nodeName.substring( lastDot + 1 );\n\n\t\t\t// Object names must be checked against an allowlist. Otherwise, there\n\t\t\t// is no way to parse 'foo.bar.baz': 'baz' must be a property, but\n\t\t\t// 'bar' could be the objectName, or part of a nodeName (which can\n\t\t\t// include '.' characters).\n\t\t\tif ( _supportedObjectNames.indexOf( objectName ) !== - 1 ) {\n\n\t\t\t\tresults.nodeName = results.nodeName.substring( 0, lastDot );\n\t\t\t\tresults.objectName = objectName;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t}\n\n\tstatic findNode( root, nodeName ) {\n\n\t\tif ( nodeName === undefined || nodeName === '' || 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\tconst 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\tconst searchNodeSubtree = function ( children ) {\n\n\t\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tconst 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\tconst 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\tconst 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\t// these are used to \"bind\" a nonexistent property\n\t_getValue_unavailable() {}\n\t_setValue_unavailable() {}\n\n\t// Getters\n\n\t_getValue_direct( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.targetObject[ this.propertyName ];\n\n\t}\n\n\t_getValue_array( buffer, offset ) {\n\n\t\tconst source = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t}\n\n\t}\n\n\t_getValue_arrayElement( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t}\n\n\t_getValue_toArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t}\n\n\t// Direct\n\n\t_setValue_direct( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// EntireArray\n\n\t_setValue_array( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t}\n\n\t_setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// ArrayElement\n\n\t_setValue_arrayElement( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// HasToFromArray\n\n\t_setValue_fromArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t}\n\n\t_setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t_getValue_unbound( targetArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.getValue( targetArray, offset );\n\n\t}\n\n\t_setValue_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() {\n\n\t\tlet targetObject = this.node;\n\t\tconst parsedPath = this.parsedPath;\n\n\t\tconst objectName = parsedPath.objectName;\n\t\tconst propertyName = parsedPath.propertyName;\n\t\tlet propertyIndex = parsedPath.propertyIndex;\n\n\t\tif ( ! targetObject ) {\n\n\t\t\ttargetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName );\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.warn( 'THREE.PropertyBinding: No target node found for track: ' + this.path + '.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( objectName ) {\n\n\t\t\tlet 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 ( let 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\tcase 'map':\n\n\t\t\t\t\tif ( 'map' in targetObject ) {\n\n\t\t\t\t\t\ttargetObject = targetObject.map;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\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.map ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material.map as node.material does not have a map.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.map;\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\tconst nodeProperty = targetObject[ propertyName ];\n\n\t\tif ( nodeProperty === undefined ) {\n\n\t\t\tconst 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\tlet versioning = this.Versioning.None;\n\n\t\tthis.targetObject = targetObject;\n\n\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\tversioning = this.Versioning.NeedsUpdate;\n\n\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\n\t\t}\n\n\t\t// determine how the property gets bound\n\t\tlet 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.morphAttributes ) {\n\n\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\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) {\n\n\t\t\t\t\tpropertyIndex = targetObject.morphTargetDictionary[ propertyIndex ];\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() {\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\nPropertyBinding.Composite = Composite;\n\nPropertyBinding.prototype.BindingType = {\n\tDirect: 0,\n\tEntireArray: 1,\n\tArrayElement: 2,\n\tHasFromToArray: 3\n};\n\nPropertyBinding.prototype.Versioning = {\n\tNone: 0,\n\tNeedsUpdate: 1,\n\tMatrixWorldNeedsUpdate: 2\n};\n\nPropertyBinding.prototype.GetterByBindingType = [\n\n\tPropertyBinding.prototype._getValue_direct,\n\tPropertyBinding.prototype._getValue_array,\n\tPropertyBinding.prototype._getValue_arrayElement,\n\tPropertyBinding.prototype._getValue_toArray,\n\n];\n\nPropertyBinding.prototype.SetterByBindingTypeAndVersioning = [\n\n\t[\n\t\t// Direct\n\t\tPropertyBinding.prototype._setValue_direct,\n\t\tPropertyBinding.prototype._setValue_direct_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// EntireArray\n\n\t\tPropertyBinding.prototype._setValue_array,\n\t\tPropertyBinding.prototype._setValue_array_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// ArrayElement\n\t\tPropertyBinding.prototype._setValue_arrayElement,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// HasToFromArray\n\t\tPropertyBinding.prototype._setValue_fromArray,\n\t\tPropertyBinding.prototype._setValue_fromArray_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate,\n\n\t]\n\n];\n\n/**\n *\n * A group of objects that receives a shared animation state.\n *\n * Usage:\n *\n * - Add objects you would otherwise pass as 'root' to the\n * constructor or the .clipAction method of AnimationMixer.\n *\n * - Instead pass this object as 'root'.\n *\n * - You can also add and remove objects later when the mixer\n * is running.\n *\n * Note:\n *\n * Objects of this class appear as one object to the mixer,\n * so cache control of the individual objects must be done\n * on the group.\n *\n * Limitation:\n *\n * - The animated properties must be compatible among the\n * all objects in the group.\n *\n * - A single property can either be controlled through a\n * target group or directly, but not both.\n */\n\nclass AnimationObjectGroup {\n\n\tconstructor() {\n\n\t\tthis.isAnimationObjectGroup = true;\n\n\t\tthis.uuid = generateUUID();\n\n\t\t// cached objects followed by the active ones\n\t\tthis._objects = Array.prototype.slice.call( arguments );\n\n\t\tthis.nCachedObjects_ = 0; // threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tconst indices = {};\n\t\tthis._indicesByUUID = indices; // for bookkeeping\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t\t}\n\n\t\tthis._paths = []; // inside: string\n\t\tthis._parsedPaths = []; // inside: { we don't care, here }\n\t\tthis._bindings = []; // inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; // inside: indices in these arrays\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._objects.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn this.total - scope.nCachedObjects_;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tget bindingsPerObject() {\n\n\t\t\t\treturn scope._bindings.length;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tadd() {\n\n\t\tconst objects = this._objects,\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\n\t\tlet knownObject = undefined,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid;\n\t\t\tlet index = 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 ( let 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\tconst 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 ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ];\n\n\t\t\t\t\tlet binding = 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'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() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst 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\tconst 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 ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst 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() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_,\n\t\t\tnObjects = objects.length;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst 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\tconst 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 ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst 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\tconst lastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\n\t\t\t\t\t}\n\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 ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst 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_( 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\tconst indicesByPath = this._bindingsIndicesByPath;\n\t\tlet index = indicesByPath[ path ];\n\t\tconst bindings = this._bindings;\n\n\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\tconst 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 ( let i = nCachedObjects, n = objects.length; i !== n; ++ i ) {\n\n\t\t\tconst 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_( 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\tconst indicesByPath = this._bindingsIndicesByPath,\n\t\t\tindex = indicesByPath[ path ];\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst 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\nclass AnimationAction {\n\n\tconstructor( mixer, clip, localRoot = null, blendMode = clip.blendMode ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot;\n\t\tthis.blendMode = blendMode;\n\n\t\tconst tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tconst interpolantSettings = {\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst interpolant = tracks[ i ].createInterpolant( null );\n\t\t\tinterpolants[ i ] = interpolant;\n\t\t\tinterpolant.settings = interpolantSettings;\n\n\t\t}\n\n\t\tthis._interpolantSettings = interpolantSettings;\n\n\t\tthis._interpolants = interpolants; // bound by the mixer\n\n\t\t// inside: PropertyMixer (managed by the mixer)\n\t\tthis._propertyBindings = new Array( nTracks );\n\n\t\tthis._cacheIndex = null; // for the memory manager\n\t\tthis._byClipCacheIndex = null; // for the memory manager\n\n\t\tthis._timeScaleInterpolant = null;\n\t\tthis._weightInterpolant = null;\n\n\t\tthis.loop = LoopRepeat;\n\t\tthis._loopCount = - 1;\n\n\t\t// global mixer time when the action is to be started\n\t\t// it's set back to 'null' upon start of the action\n\t\tthis._startTime = null;\n\n\t\t// scaled local time of the action\n\t\t// gets clamped or wrapped to 0..clip.duration according to loop\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1;\n\t\tthis._effectiveTimeScale = 1;\n\n\t\tthis.weight = 1;\n\t\tthis._effectiveWeight = 1;\n\n\t\tthis.repetitions = Infinity; // no. of repetitions when looping\n\n\t\tthis.paused = false; // true -> zero effective time scale\n\t\tthis.enabled = true; // false -> zero effective weight\n\n\t\tthis.clampWhenFinished = false;// keep feeding the last frame?\n\n\t\tthis.zeroSlopeAtStart = true;// for smooth interpolation w/o separate\n\t\tthis.zeroSlopeAtEnd = true;// clips for start, loop and end\n\n\t}\n\n\t// State & Scheduling\n\n\tplay() {\n\n\t\tthis._mixer._activateAction( this );\n\n\t\treturn this;\n\n\t}\n\n\tstop() {\n\n\t\tthis._mixer._deactivateAction( this );\n\n\t\treturn this.reset();\n\n\t}\n\n\treset() {\n\n\t\tthis.paused = false;\n\t\tthis.enabled = true;\n\n\t\tthis.time = 0; // restart clip\n\t\tthis._loopCount = - 1;// forget previous loops\n\t\tthis._startTime = null;// forget scheduling\n\n\t\treturn this.stopFading().stopWarping();\n\n\t}\n\n\tisRunning() {\n\n\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t}\n\n\t// return true when play has been called\n\tisScheduled() {\n\n\t\treturn this._mixer._isActiveAction( this );\n\n\t}\n\n\tstartAt( time ) {\n\n\t\tthis._startTime = time;\n\n\t\treturn this;\n\n\t}\n\n\tsetLoop( 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( 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() {\n\n\t\treturn this._effectiveWeight;\n\n\t}\n\n\tfadeIn( duration ) {\n\n\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t}\n\n\tfadeOut( duration ) {\n\n\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t}\n\n\tcrossFadeFrom( fadeOutAction, duration, warp ) {\n\n\t\tfadeOutAction.fadeOut( duration );\n\t\tthis.fadeIn( duration );\n\n\t\tif ( warp ) {\n\n\t\t\tconst 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( fadeInAction, duration, warp ) {\n\n\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t}\n\n\tstopFading() {\n\n\t\tconst 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( 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() {\n\n\t\treturn this._effectiveTimeScale;\n\n\t}\n\n\tsetDuration( duration ) {\n\n\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\tsyncWith( 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( duration ) {\n\n\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t}\n\n\twarp( startTimeScale, endTimeScale, duration ) {\n\n\t\tconst mixer = this._mixer,\n\t\t\tnow = mixer.time,\n\t\t\ttimeScale = this.timeScale;\n\n\t\tlet interpolant = this._timeScaleInterpolant;\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\tconst 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() {\n\n\t\tconst 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() {\n\n\t\treturn this._mixer;\n\n\t}\n\n\tgetClip() {\n\n\t\treturn this._clip;\n\n\t}\n\n\tgetRoot() {\n\n\t\treturn this._localRoot || this._mixer._root;\n\n\t}\n\n\t// Interna\n\n\t_update( 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\tconst startTime = this._startTime;\n\n\t\tif ( startTime !== null ) {\n\n\t\t\t// check for scheduled start of action\n\n\t\t\tconst timeRunning = ( time - startTime ) * timeDirection;\n\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\tdeltaTime = 0;\n\n\t\t\t} else {\n\n\n\t\t\t\tthis._startTime = null; // unschedule\n\t\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// apply time scale and advance time\n\n\t\tdeltaTime *= this._updateTimeScale( time );\n\t\tconst 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\tconst weight = this._updateWeight( time );\n\n\t\tif ( weight > 0 ) {\n\n\t\t\tconst interpolants = this._interpolants;\n\t\t\tconst propertyMixers = this._propertyBindings;\n\n\t\t\tswitch ( this.blendMode ) {\n\n\t\t\t\tcase AdditiveAnimationBlendMode:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulateAdditive( weight );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase NormalAnimationBlendMode:\n\t\t\t\tdefault:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_updateWeight( time ) {\n\n\t\tlet weight = 0;\n\n\t\tif ( this.enabled ) {\n\n\t\t\tweight = this.weight;\n\t\t\tconst interpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst 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( time ) {\n\n\t\tlet timeScale = 0;\n\n\t\tif ( ! this.paused ) {\n\n\t\t\ttimeScale = this.timeScale;\n\n\t\t\tconst interpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst 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( deltaTime ) {\n\n\t\tconst duration = this._clip.duration;\n\t\tconst loop = this.loop;\n\n\t\tlet time = this.time + deltaTime;\n\t\tlet loopCount = this._loopCount;\n\n\t\tconst pingPong = ( loop === LoopPingPong );\n\n\t\tif ( deltaTime === 0 ) {\n\n\t\t\tif ( loopCount === - 1 ) return time;\n\n\t\t\treturn ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time;\n\n\t\t}\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 {\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tbreak handle_stop;\n\n\t\t\t\t}\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.time = time;\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\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\tconst 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\tconst 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.time = time;\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\tconst 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.time = time;\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} else {\n\n\t\t\t\tthis.time = time;\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\treturn duration - time;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn time;\n\n\t}\n\n\t_setEndings( atStart, atEnd, pingPong ) {\n\n\t\tconst settings = this._interpolantSettings;\n\n\t\tif ( pingPong ) {\n\n\t\t\tsettings.endingStart = ZeroSlopeEnding;\n\t\t\tsettings.endingEnd = 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( duration, weightNow, weightThen ) {\n\n\t\tconst mixer = this._mixer, now = mixer.time;\n\t\tlet interpolant = 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\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\tvalues[ 0 ] = weightNow;\n\t\ttimes[ 1 ] = now + duration;\n\t\tvalues[ 1 ] = weightThen;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _controlInterpolantsResultBuffer = new Float32Array( 1 );\n\n\nclass AnimationMixer extends EventDispatcher {\n\n\tconstructor( root ) {\n\n\t\tsuper();\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\t\tthis.time = 0;\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\t_bindAction( action, prototypeAction ) {\n\n\t\tconst 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\n\t\tlet bindingsByName = 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 ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst track = tracks[ i ],\n\t\t\t\ttrackName = track.name;\n\n\t\t\tlet binding = bindingsByName[ trackName ];\n\n\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t++ binding.referenceCount;\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\tconst 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( 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\tconst 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\tconst bindings = action._propertyBindings;\n\n\t\t\t// increment reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst 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( action ) {\n\n\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// decrement reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst 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() {\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// \tknownActions: Array< AnimationAction > - used as prototypes\n\t\t// \tactionByRoot: AnimationAction - 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\tconst 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( action ) {\n\n\t\tconst index = action._cacheIndex;\n\t\treturn index !== null && index < this._nActiveActions;\n\n\t}\n\n\t_addInactiveAction( action, clipUuid, rootUuid ) {\n\n\t\tconst actions = this._actions,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tlet actionsForClip = 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\tconst 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( action ) {\n\n\t\tconst 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\tconst 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\tconst 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( action ) {\n\n\t\tconst bindings = action._propertyBindings;\n\n\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tconst 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( 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\tconst 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( 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\tconst 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( binding, rootUuid, trackName ) {\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindings = this._bindings;\n\n\t\tlet bindingByName = bindingsByRoot[ rootUuid ];\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( binding ) {\n\n\t\tconst 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\tif ( Object.keys( bindingByName ).length === 0 ) {\n\n\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t}\n\n\t}\n\n\t_lendBinding( binding ) {\n\n\t\tconst 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( binding ) {\n\n\t\tconst 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() {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++;\n\n\t\tlet interpolant = 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, _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( interpolant ) {\n\n\t\tconst 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// 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( clip, optionalRoot, blendMode ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid;\n\n\t\tlet clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip;\n\n\t\tconst clipUuid = clipObject !== null ? clipObject.uuid : clip;\n\n\t\tconst actionsForClip = this._actionsByClip[ clipUuid ];\n\t\tlet prototypeAction = null;\n\n\t\tif ( blendMode === undefined ) {\n\n\t\t\tif ( clipObject !== null ) {\n\n\t\t\t\tblendMode = clipObject.blendMode;\n\n\t\t\t} else {\n\n\t\t\t\tblendMode = NormalAnimationBlendMode;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\tconst existingAction = actionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\tif ( existingAction !== undefined && existingAction.blendMode === blendMode ) {\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\tconst newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode );\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( clip, optionalRoot ) {\n\n\t\tconst 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() {\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions;\n\n\t\tfor ( let i = nActions - 1; i >= 0; -- i ) {\n\n\t\t\tactions[ i ].stop();\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( deltaTime ) {\n\n\t\tdeltaTime *= this.timeScale;\n\n\t\tconst 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 ( let i = 0; i !== nActions; ++ i ) {\n\n\t\t\tconst 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\tconst bindings = this._bindings,\n\t\t\tnBindings = this._nActiveBindings;\n\n\t\tfor ( let 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// Allows you to seek to a specific time in an animation.\n\tsetTime( timeInSeconds ) {\n\n\t\tthis.time = 0; // Zero out time attribute for AnimationMixer object;\n\t\tfor ( let i = 0; i < this._actions.length; i ++ ) {\n\n\t\t\tthis._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects.\n\n\t\t}\n\n\t\treturn this.update( timeInSeconds ); // Update used to set exact time. Returns \"this\" AnimationMixer object.\n\n\t}\n\n\t// return this mixer's root target object\n\tgetRoot() {\n\n\t\treturn this._root;\n\n\t}\n\n\t// free all resources specific to a particular clip\n\tuncacheClip( clip ) {\n\n\t\tconst 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\tconst actionsToRemove = actionsForClip.knownActions;\n\n\t\t\tfor ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\tconst action = actionsToRemove[ i ];\n\n\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\tconst 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( root ) {\n\n\t\tconst rootUuid = root.uuid,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tfor ( const clipUuid in actionsByClip ) {\n\n\t\t\tconst 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\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName !== undefined ) {\n\n\t\t\tfor ( const trackName in bindingByName ) {\n\n\t\t\t\tconst 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( clip, optionalRoot ) {\n\n\t\tconst 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\nclass Uniform {\n\n\tconstructor( value ) {\n\n\t\tthis.value = value;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n\t}\n\n}\n\nlet _id = 0;\n\nclass UniformsGroup extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isUniformsGroup = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _id ++ } );\n\n\t\tthis.name = '';\n\n\t\tthis.usage = StaticDrawUsage;\n\t\tthis.uniforms = [];\n\n\t}\n\n\tadd( uniform ) {\n\n\t\tthis.uniforms.push( uniform );\n\n\t\treturn this;\n\n\t}\n\n\tremove( uniform ) {\n\n\t\tconst index = this.uniforms.indexOf( uniform );\n\n\t\tif ( index !== - 1 ) this.uniforms.splice( index, 1 );\n\n\t\treturn this;\n\n\t}\n\n\tsetName( name ) {\n\n\t\tthis.name = name;\n\n\t\treturn this;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.usage = source.usage;\n\n\t\tconst uniformsSource = source.uniforms;\n\n\t\tthis.uniforms.length = 0;\n\n\t\tfor ( let i = 0, l = uniformsSource.length; i < l; i ++ ) {\n\n\t\t\tthis.uniforms.push( uniformsSource[ i ].clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nclass InstancedInterleavedBuffer extends InterleavedBuffer {\n\n\tconstructor( array, stride, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, stride );\n\n\t\tthis.isInstancedInterleavedBuffer = true;\n\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tconst ib = super.clone( data );\n\n\t\tib.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn ib;\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tconst json = super.toJSON( data );\n\n\t\tjson.isInstancedInterleavedBuffer = true;\n\t\tjson.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn json;\n\n\t}\n\n}\n\nclass GLBufferAttribute {\n\n\tconstructor( buffer, type, itemSize, elementSize, count ) {\n\n\t\tthis.isGLBufferAttribute = true;\n\n\t\tthis.name = '';\n\n\t\tthis.buffer = buffer;\n\t\tthis.type = type;\n\t\tthis.itemSize = itemSize;\n\t\tthis.elementSize = elementSize;\n\t\tthis.count = count;\n\n\t\tthis.version = 0;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tsetBuffer( buffer ) {\n\n\t\tthis.buffer = buffer;\n\n\t\treturn this;\n\n\t}\n\n\tsetType( type, elementSize ) {\n\n\t\tthis.type = type;\n\t\tthis.elementSize = elementSize;\n\n\t\treturn this;\n\n\t}\n\n\tsetItemSize( itemSize ) {\n\n\t\tthis.itemSize = itemSize;\n\n\t\treturn this;\n\n\t}\n\n\tsetCount( count ) {\n\n\t\tthis.count = count;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass Raycaster {\n\n\tconstructor( origin, direction, near = 0, far = Infinity ) {\n\n\t\tthis.ray = new Ray( origin, direction );\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\t\tthis.camera = null;\n\t\tthis.layers = new Layers();\n\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: { threshold: 1 },\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t}\n\n\tset( 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( coords, camera ) {\n\n\t\tif ( 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\t\t\tthis.camera = camera;\n\n\t\t} else if ( 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\t\t\tthis.camera = camera;\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type: ' + camera.type );\n\n\t\t}\n\n\t}\n\n\tintersectObject( object, recursive = true, intersects = [] ) {\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( objects, recursive = true, intersects = [] ) {\n\n\t\tfor ( let 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\nfunction ascSort( a, b ) {\n\n\treturn a.distance - b.distance;\n\n}\n\nfunction intersectObject( object, raycaster, intersects, recursive ) {\n\n\tif ( object.layers.test( raycaster.layers ) ) {\n\n\t\tobject.raycast( raycaster, intersects );\n\n\t}\n\n\tif ( recursive === true ) {\n\n\t\tconst children = object.children;\n\n\t\tfor ( let 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\n/**\n * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n *\n * The polar angle (phi) is measured from the positive y-axis. The positive y-axis is up.\n * The azimuthal angle (theta) is measured from the positive z-axis.\n */\n\n\nclass Spherical {\n\n\tconstructor( radius = 1, phi = 0, theta = 0 ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi; // polar angle\n\t\tthis.theta = theta; // azimuthal angle\n\n\t\treturn this;\n\n\t}\n\n\tset( 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\tcopy( 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 between EPS and PI-EPS\n\tmakeSafe() {\n\n\t\tconst 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( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + y * y + z * z );\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( x, z );\n\t\t\tthis.phi = Math.acos( clamp( y / this.radius, - 1, 1 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system\n */\n\nclass Cylindrical {\n\n\tconstructor( radius = 1, theta = 0, y = 0 ) {\n\n\t\tthis.radius = radius; // distance from the origin to a point in the x-z plane\n\t\tthis.theta = theta; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis\n\t\tthis.y = y; // height above the x-z plane\n\n\t\treturn this;\n\n\t}\n\n\tset( 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\tcopy( 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( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + z * z );\n\t\tthis.theta = Math.atan2( x, z );\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$4 = /*@__PURE__*/ new Vector2();\n\nclass Box2 {\n\n\tconstructor( min = new Vector2( + Infinity, + Infinity ), max = new Vector2( - Infinity, - Infinity ) ) {\n\n\t\tthis.isBox2 = true;\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t}\n\n\tset( 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( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let 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( center, size ) {\n\n\t\tconst halfSize = _vector$4.copy( size ).multiplyScalar( 0.5 );\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( 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() {\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() {\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( target ) {\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( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\texpandByPoint( 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( 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( 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( 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( 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( 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\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( 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( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _vector$4 ).distanceTo( point );\n\n\t}\n\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\tunion( 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( 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( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nconst _startP = /*@__PURE__*/ new Vector3();\nconst _startEnd = /*@__PURE__*/ new Vector3();\n\nclass Line3 {\n\n\tconstructor( start = new Vector3(), end = new Vector3() ) {\n\n\t\tthis.start = start;\n\t\tthis.end = end;\n\n\t}\n\n\tset( 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\tcopy( 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( target ) {\n\n\t\treturn target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t}\n\n\tdelta( target ) {\n\n\t\treturn target.subVectors( this.end, this.start );\n\n\t}\n\n\tdistanceSq() {\n\n\t\treturn this.start.distanceToSquared( this.end );\n\n\t}\n\n\tdistance() {\n\n\t\treturn this.start.distanceTo( this.end );\n\n\t}\n\n\tat( t, target ) {\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\tclosestPointToPointParameter( point, clampToLine ) {\n\n\t\t_startP.subVectors( point, this.start );\n\t\t_startEnd.subVectors( this.end, this.start );\n\n\t\tconst startEnd2 = _startEnd.dot( _startEnd );\n\t\tconst startEnd_startP = _startEnd.dot( _startP );\n\n\t\tlet t = startEnd_startP / startEnd2;\n\n\t\tif ( clampToLine ) {\n\n\t\t\tt = clamp( t, 0, 1 );\n\n\t\t}\n\n\t\treturn t;\n\n\t}\n\n\tclosestPointToPoint( point, clampToLine, target ) {\n\n\t\tconst t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\tapplyMatrix4( 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( line ) {\n\n\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$3 = /*@__PURE__*/ new Vector3();\n\nclass SpotLightHelper extends Object3D {\n\n\tconstructor( light, color ) {\n\n\t\tsuper();\n\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.color = color;\n\n\t\tthis.type = 'SpotLightHelper';\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst positions = [\n\t\t\t0, 0, 0, \t0, 0, 1,\n\t\t\t0, 0, 0, \t1, 0, 1,\n\t\t\t0, 0, 0,\t- 1, 0, 1,\n\t\t\t0, 0, 0, \t0, 1, 1,\n\t\t\t0, 0, 0, \t0, - 1, 1\n\t\t];\n\n\t\tfor ( let i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tconst p1 = ( i / l ) * Math.PI * 2;\n\t\t\tconst p2 = ( j / l ) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t\t);\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\tthis.cone = new LineSegments( geometry, material );\n\t\tthis.add( this.cone );\n\n\t\tthis.update();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\tconst coneLength = this.light.distance ? this.light.distance : 1000;\n\t\tconst coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t_vector$3.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\tthis.cone.lookAt( _vector$3 );\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\nconst _vector$2 = /*@__PURE__*/ new Vector3();\nconst _boneMatrix = /*@__PURE__*/ new Matrix4();\nconst _matrixWorldInv = /*@__PURE__*/ new Matrix4();\n\n\nclass SkeletonHelper extends LineSegments {\n\n\tconstructor( object ) {\n\n\t\tconst bones = getBoneList( object );\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst color1 = new Color( 0, 0, 1 );\n\t\tconst color2 = new Color( 0, 1, 0 );\n\n\t\tfor ( let i = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tcolors.push( color1.r, color1.g, color1.b );\n\t\t\t\tcolors.push( color2.r, color2.g, color2.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isSkeletonHelper = true;\n\n\t\tthis.type = 'SkeletonHelper';\n\n\t\tthis.root = object;\n\t\tthis.bones = bones;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst bones = this.bones;\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t_matrixWorldInv.copy( this.root.matrixWorld ).invert();\n\n\t\tfor ( let i = 0, j = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j + 1, _vector$2.x, _vector$2.y, _vector$2.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\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction getBoneList( object ) {\n\n\tconst boneList = [];\n\n\tif ( object.isBone === true ) {\n\n\t\tboneList.push( object );\n\n\t}\n\n\tfor ( let 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\nclass PointLightHelper extends Mesh {\n\n\tconstructor( light, sphereSize, color ) {\n\n\t\tconst geometry = new SphereGeometry( sphereSize, 4, 2 );\n\t\tconst material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.light = light;\n\n\t\tthis.color = color;\n\n\t\tthis.type = 'PointLightHelper';\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\n\t\t/*\n\t// TODO: delete this comment?\n\tconst distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\tconst 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\tconst 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\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\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\tthis.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\t/*\n\t\tconst d = this.light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.visible = true;\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\t\t*/\n\n\t}\n\n}\n\nconst _vector$1 = /*@__PURE__*/ new Vector3();\nconst _color1 = /*@__PURE__*/ new Color();\nconst _color2 = /*@__PURE__*/ new Color();\n\nclass HemisphereLightHelper extends Object3D {\n\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.color = color;\n\n\t\tthis.type = 'HemisphereLightHelper';\n\n\t\tconst geometry = new OctahedronGeometry( size );\n\t\tgeometry.rotateY( Math.PI * 0.5 );\n\n\t\tthis.material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\t\tif ( this.color === undefined ) this.material.vertexColors = true;\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\t\tconst colors = new Float32Array( position.count * 3 );\n\n\t\tgeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tthis.add( new Mesh( geometry, this.material ) );\n\n\t\tthis.update();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tconst 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\tconst colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\t_color1.copy( this.light.color );\n\t\t\t_color2.copy( this.light.groundColor );\n\n\t\t\tfor ( let i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tconst 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\tthis.light.updateWorldMatrix( true, false );\n\n\t\tmesh.lookAt( _vector$1.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t}\n\n}\n\nclass GridHelper extends LineSegments {\n\n\tconstructor( size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst center = divisions / 2;\n\t\tconst step = size / divisions;\n\t\tconst halfSize = size / 2;\n\n\t\tconst vertices = [], colors = [];\n\n\t\tfor ( let i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\t\tconst color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'GridHelper';\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nclass PolarGridHelper extends LineSegments {\n\n\tconstructor( radius = 10, sectors = 16, rings = 8, divisions = 64, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\t// create the sectors\n\n\t\tif ( sectors > 1 ) {\n\n\t\t\tfor ( let i = 0; i < sectors; i ++ ) {\n\n\t\t\t\tconst v = ( i / sectors ) * ( Math.PI * 2 );\n\n\t\t\t\tconst x = Math.sin( v ) * radius;\n\t\t\t\tconst z = Math.cos( v ) * radius;\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( x, 0, z );\n\n\t\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// create the rings\n\n\t\tfor ( let i = 0; i < rings; i ++ ) {\n\n\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\tconst r = radius - ( radius / rings * i );\n\n\t\t\tfor ( let j = 0; j < divisions; j ++ ) {\n\n\t\t\t\t// first vertex\n\n\t\t\t\tlet v = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tlet x = Math.sin( v ) * r;\n\t\t\t\tlet z = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t// second vertex\n\n\t\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'PolarGridHelper';\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\nconst _v3 = /*@__PURE__*/ new Vector3();\n\nclass DirectionalLightHelper extends Object3D {\n\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.color = color;\n\n\t\tthis.type = 'DirectionalLightHelper';\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tlet geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [\n\t\t\t- size, size, 0,\n\t\t\tsize, size, 0,\n\t\t\tsize, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\tthis.lightPlane = new Line( geometry, material );\n\t\tthis.add( this.lightPlane );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\tthis.targetLine = new Line( geometry, material );\n\t\tthis.add( this.targetLine );\n\n\t\tthis.update();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.lightPlane.geometry.dispose();\n\t\tthis.lightPlane.material.dispose();\n\t\tthis.targetLine.geometry.dispose();\n\t\tthis.targetLine.material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\t_v1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t_v2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t_v3.subVectors( _v2, _v1 );\n\n\t\tthis.lightPlane.lookAt( _v2 );\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( _v2 );\n\t\tthis.targetLine.scale.z = _v3.length();\n\n\t}\n\n}\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _camera = /*@__PURE__*/ new Camera();\n\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\thttps://github.com/evanw/lightgl.js/blob/master/tests/shadowmap.html\n */\n\nclass CameraHelper extends LineSegments {\n\n\tconstructor( camera ) {\n\n\t\tconst geometry = new BufferGeometry();\n\t\tconst material = new LineBasicMaterial( { color: 0xffffff, vertexColors: true, toneMapped: false } );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst pointMap = {};\n\n\t\t// near\n\n\t\taddLine( 'n1', 'n2' );\n\t\taddLine( 'n2', 'n4' );\n\t\taddLine( 'n4', 'n3' );\n\t\taddLine( 'n3', 'n1' );\n\n\t\t// far\n\n\t\taddLine( 'f1', 'f2' );\n\t\taddLine( 'f2', 'f4' );\n\t\taddLine( 'f4', 'f3' );\n\t\taddLine( 'f3', 'f1' );\n\n\t\t// sides\n\n\t\taddLine( 'n1', 'f1' );\n\t\taddLine( 'n2', 'f2' );\n\t\taddLine( 'n3', 'f3' );\n\t\taddLine( 'n4', 'f4' );\n\n\t\t// cone\n\n\t\taddLine( 'p', 'n1' );\n\t\taddLine( 'p', 'n2' );\n\t\taddLine( 'p', 'n3' );\n\t\taddLine( 'p', 'n4' );\n\n\t\t// up\n\n\t\taddLine( 'u1', 'u2' );\n\t\taddLine( 'u2', 'u3' );\n\t\taddLine( 'u3', 'u1' );\n\n\t\t// target\n\n\t\taddLine( 'c', 't' );\n\t\taddLine( 'p', 'c' );\n\n\t\t// cross\n\n\t\taddLine( 'cn1', 'cn2' );\n\t\taddLine( 'cn3', 'cn4' );\n\n\t\taddLine( 'cf1', 'cf2' );\n\t\taddLine( 'cf3', 'cf4' );\n\n\t\tfunction addLine( a, b ) {\n\n\t\t\taddPoint( a );\n\t\t\taddPoint( b );\n\n\t\t}\n\n\t\tfunction addPoint( id ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( 0, 0, 0 );\n\n\t\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\t\tpointMap[ id ] = [];\n\n\t\t\t}\n\n\t\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'CameraHelper';\n\n\t\tthis.camera = camera;\n\t\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\t\tthis.matrix = camera.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.pointMap = pointMap;\n\n\t\tthis.update();\n\n\t\t// colors\n\n\t\tconst colorFrustum = new Color( 0xffaa00 );\n\t\tconst colorCone = new Color( 0xff0000 );\n\t\tconst colorUp = new Color( 0x00aaff );\n\t\tconst colorTarget = new Color( 0xffffff );\n\t\tconst colorCross = new Color( 0x333333 );\n\n\t\tthis.setColors( colorFrustum, colorCone, colorUp, colorTarget, colorCross );\n\n\t}\n\n\tsetColors( frustum, cone, up, target, cross ) {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst colorAttribute = geometry.getAttribute( 'color' );\n\n\t\t// near\n\n\t\tcolorAttribute.setXYZ( 0, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 1, frustum.r, frustum.g, frustum.b ); // n1, n2\n\t\tcolorAttribute.setXYZ( 2, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 3, frustum.r, frustum.g, frustum.b ); // n2, n4\n\t\tcolorAttribute.setXYZ( 4, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 5, frustum.r, frustum.g, frustum.b ); // n4, n3\n\t\tcolorAttribute.setXYZ( 6, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 7, frustum.r, frustum.g, frustum.b ); // n3, n1\n\n\t\t// far\n\n\t\tcolorAttribute.setXYZ( 8, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 9, frustum.r, frustum.g, frustum.b ); // f1, f2\n\t\tcolorAttribute.setXYZ( 10, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 11, frustum.r, frustum.g, frustum.b ); // f2, f4\n\t\tcolorAttribute.setXYZ( 12, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 13, frustum.r, frustum.g, frustum.b ); // f4, f3\n\t\tcolorAttribute.setXYZ( 14, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 15, frustum.r, frustum.g, frustum.b ); // f3, f1\n\n\t\t// sides\n\n\t\tcolorAttribute.setXYZ( 16, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 17, frustum.r, frustum.g, frustum.b ); // n1, f1\n\t\tcolorAttribute.setXYZ( 18, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 19, frustum.r, frustum.g, frustum.b ); // n2, f2\n\t\tcolorAttribute.setXYZ( 20, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 21, frustum.r, frustum.g, frustum.b ); // n3, f3\n\t\tcolorAttribute.setXYZ( 22, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 23, frustum.r, frustum.g, frustum.b ); // n4, f4\n\n\t\t// cone\n\n\t\tcolorAttribute.setXYZ( 24, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 25, cone.r, cone.g, cone.b ); // p, n1\n\t\tcolorAttribute.setXYZ( 26, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 27, cone.r, cone.g, cone.b ); // p, n2\n\t\tcolorAttribute.setXYZ( 28, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 29, cone.r, cone.g, cone.b ); // p, n3\n\t\tcolorAttribute.setXYZ( 30, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 31, cone.r, cone.g, cone.b ); // p, n4\n\n\t\t// up\n\n\t\tcolorAttribute.setXYZ( 32, up.r, up.g, up.b ); colorAttribute.setXYZ( 33, up.r, up.g, up.b ); // u1, u2\n\t\tcolorAttribute.setXYZ( 34, up.r, up.g, up.b ); colorAttribute.setXYZ( 35, up.r, up.g, up.b ); // u2, u3\n\t\tcolorAttribute.setXYZ( 36, up.r, up.g, up.b ); colorAttribute.setXYZ( 37, up.r, up.g, up.b ); // u3, u1\n\n\t\t// target\n\n\t\tcolorAttribute.setXYZ( 38, target.r, target.g, target.b ); colorAttribute.setXYZ( 39, target.r, target.g, target.b ); // c, t\n\t\tcolorAttribute.setXYZ( 40, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 41, cross.r, cross.g, cross.b ); // p, c\n\n\t\t// cross\n\n\t\tcolorAttribute.setXYZ( 42, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 43, cross.r, cross.g, cross.b ); // cn1, cn2\n\t\tcolorAttribute.setXYZ( 44, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 45, cross.r, cross.g, cross.b ); // cn3, cn4\n\n\t\tcolorAttribute.setXYZ( 46, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 47, cross.r, cross.g, cross.b ); // cf1, cf2\n\t\tcolorAttribute.setXYZ( 48, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 49, cross.r, cross.g, cross.b ); // cf3, cf4\n\n\t\tcolorAttribute.needsUpdate = true;\n\n\t}\n\n\tupdate() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst pointMap = this.pointMap;\n\n\t\tconst w = 1, h = 1;\n\n\t\t// we need just camera projection matrix inverse\n\t\t// world matrix must be identity\n\n\t\t_camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse );\n\n\t\t// center / target\n\n\t\tsetPoint( 'c', pointMap, geometry, _camera, 0, 0, - 1 );\n\t\tsetPoint( 't', pointMap, geometry, _camera, 0, 0, 1 );\n\n\t\t// near\n\n\t\tsetPoint( 'n1', pointMap, geometry, _camera, - w, - h, - 1 );\n\t\tsetPoint( 'n2', pointMap, geometry, _camera, w, - h, - 1 );\n\t\tsetPoint( 'n3', pointMap, geometry, _camera, - w, h, - 1 );\n\t\tsetPoint( 'n4', pointMap, geometry, _camera, w, h, - 1 );\n\n\t\t// far\n\n\t\tsetPoint( 'f1', pointMap, geometry, _camera, - w, - h, 1 );\n\t\tsetPoint( 'f2', pointMap, geometry, _camera, w, - h, 1 );\n\t\tsetPoint( 'f3', pointMap, geometry, _camera, - w, h, 1 );\n\t\tsetPoint( 'f4', pointMap, geometry, _camera, w, h, 1 );\n\n\t\t// up\n\n\t\tsetPoint( 'u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, - 1 );\n\t\tsetPoint( 'u2', pointMap, geometry, _camera, - w * 0.7, h * 1.1, - 1 );\n\t\tsetPoint( 'u3', pointMap, geometry, _camera, 0, h * 2, - 1 );\n\n\t\t// cross\n\n\t\tsetPoint( 'cf1', pointMap, geometry, _camera, - w, 0, 1 );\n\t\tsetPoint( 'cf2', pointMap, geometry, _camera, w, 0, 1 );\n\t\tsetPoint( 'cf3', pointMap, geometry, _camera, 0, - h, 1 );\n\t\tsetPoint( 'cf4', pointMap, geometry, _camera, 0, h, 1 );\n\n\t\tsetPoint( 'cn1', pointMap, geometry, _camera, - w, 0, - 1 );\n\t\tsetPoint( 'cn2', pointMap, geometry, _camera, w, 0, - 1 );\n\t\tsetPoint( 'cn3', pointMap, geometry, _camera, 0, - h, - 1 );\n\t\tsetPoint( 'cn4', pointMap, geometry, _camera, 0, h, - 1 );\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction setPoint( point, pointMap, geometry, camera, x, y, z ) {\n\n\t_vector.set( x, y, z ).unproject( camera );\n\n\tconst points = pointMap[ point ];\n\n\tif ( points !== undefined ) {\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tposition.setXYZ( points[ i ], _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t}\n\n}\n\nconst _box = /*@__PURE__*/ new Box3();\n\nclass BoxHelper extends LineSegments {\n\n\tconstructor( object, color = 0xffff00 ) {\n\n\t\tconst 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\t\tconst positions = new Float32Array( 8 * 3 );\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.object = object;\n\t\tthis.type = 'BoxHelper';\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\tupdate( 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\t_box.setFromObject( this.object );\n\n\t\t}\n\n\t\tif ( _box.isEmpty() ) return;\n\n\t\tconst min = _box.min;\n\t\tconst max = _box.max;\n\n\t\t/*\n\t\t\t5____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\tconst position = this.geometry.attributes.position;\n\t\tconst 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\tsetFromObject( object ) {\n\n\t\tthis.object = object;\n\t\tthis.update();\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.object = source.object;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nclass Box3Helper extends LineSegments {\n\n\tconstructor( box, color = 0xffff00 ) {\n\n\t\tconst 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\t\tconst 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\t\tconst geometry = new BufferGeometry();\n\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.box = box;\n\n\t\tthis.type = 'Box3Helper';\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst box = this.box;\n\n\t\tif ( box.isEmpty() ) return;\n\n\t\tbox.getCenter( this.position );\n\n\t\tbox.getSize( this.scale );\n\n\t\tthis.scale.multiplyScalar( 0.5 );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nclass PlaneHelper extends Line {\n\n\tconstructor( plane, size = 1, hex = 0xffff00 ) {\n\n\t\tconst color = hex;\n\n\t\tconst positions = [ 1, - 1, 0, - 1, 1, 0, - 1, - 1, 0, 1, 1, 0, - 1, 1, 0, - 1, - 1, 0, 1, - 1, 0, 1, 1, 0 ];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tgeometry.computeBoundingSphere();\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.type = 'PlaneHelper';\n\n\t\tthis.plane = plane;\n\n\t\tthis.size = size;\n\n\t\tconst positions2 = [ 1, 1, 0, - 1, 1, 0, - 1, - 1, 0, 1, 1, 0, - 1, - 1, 0, 1, - 1, 0 ];\n\n\t\tconst geometry2 = new BufferGeometry();\n\t\tgeometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\t\tgeometry2.computeBoundingSphere();\n\n\t\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false } ) ) );\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tthis.position.set( 0, 0, 0 );\n\n\t\tthis.scale.set( 0.5 * this.size, 0.5 * this.size, 1 );\n\n\t\tthis.lookAt( this.plane.normal );\n\n\t\tthis.translateZ( - this.plane.constant );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n}\n\nconst _axis = /*@__PURE__*/ new Vector3();\nlet _lineGeometry, _coneGeometry;\n\nclass ArrowHelper extends Object3D {\n\n\t// dir is assumed to be normalized\n\n\tconstructor( dir = new Vector3( 0, 0, 1 ), origin = new Vector3( 0, 0, 0 ), length = 1, color = 0xffff00, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ArrowHelper';\n\n\t\tif ( _lineGeometry === undefined ) {\n\n\t\t\t_lineGeometry = new BufferGeometry();\n\t\t\t_lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t\t_coneGeometry = new CylinderGeometry( 0, 0.5, 1, 5, 1 );\n\t\t\t_coneGeometry.translate( 0, - 0.5, 0 );\n\n\t\t}\n\n\t\tthis.position.copy( origin );\n\n\t\tthis.line = new Line( _lineGeometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\tthis.cone = new Mesh( _coneGeometry, new MeshBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.cone.matrixAutoUpdate = false;\n\t\tthis.add( this.cone );\n\n\t\tthis.setDirection( dir );\n\t\tthis.setLength( length, headLength, headWidth );\n\n\t}\n\n\tsetDirection( 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\t_axis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\tconst radians = Math.acos( dir.y );\n\n\t\t\tthis.quaternion.setFromAxisAngle( _axis, radians );\n\n\t\t}\n\n\t}\n\n\tsetLength( length, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tthis.line.scale.set( 1, Math.max( 0.0001, length - headLength ), 1 ); // see #17458\n\t\tthis.line.updateMatrix();\n\n\t\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\t\tthis.cone.position.y = length;\n\t\tthis.cone.updateMatrix();\n\n\t}\n\n\tsetColor( color ) {\n\n\t\tthis.line.material.color.set( color );\n\t\tthis.cone.material.color.set( color );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tthis.line.copy( source.line );\n\t\tthis.cone.copy( source.cone );\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.line.geometry.dispose();\n\t\tthis.line.material.dispose();\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n}\n\nclass AxesHelper extends LineSegments {\n\n\tconstructor( size = 1 ) {\n\n\t\tconst vertices = [\n\t\t\t0, 0, 0,\tsize, 0, 0,\n\t\t\t0, 0, 0,\t0, size, 0,\n\t\t\t0, 0, 0,\t0, 0, size\n\t\t];\n\n\t\tconst colors = [\n\t\t\t1, 0, 0,\t1, 0.6, 0,\n\t\t\t0, 1, 0,\t0.6, 1, 0,\n\t\t\t0, 0, 1,\t0, 0.6, 1\n\t\t];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'AxesHelper';\n\n\t}\n\n\tsetColors( xAxisColor, yAxisColor, zAxisColor ) {\n\n\t\tconst color = new Color();\n\t\tconst array = this.geometry.attributes.color.array;\n\n\t\tcolor.set( xAxisColor );\n\t\tcolor.toArray( array, 0 );\n\t\tcolor.toArray( array, 3 );\n\n\t\tcolor.set( yAxisColor );\n\t\tcolor.toArray( array, 6 );\n\t\tcolor.toArray( array, 9 );\n\n\t\tcolor.set( zAxisColor );\n\t\tcolor.toArray( array, 12 );\n\t\tcolor.toArray( array, 15 );\n\n\t\tthis.geometry.attributes.color.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nclass ShapePath {\n\n\tconstructor() {\n\n\t\tthis.type = 'ShapePath';\n\n\t\tthis.color = new Color();\n\n\t\tthis.subPaths = [];\n\t\tthis.currentPath = null;\n\n\t}\n\n\tmoveTo( 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\treturn this;\n\n\t}\n\n\tlineTo( x, y ) {\n\n\t\tthis.currentPath.lineTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tsplineThru( pts ) {\n\n\t\tthis.currentPath.splineThru( pts );\n\n\t\treturn this;\n\n\t}\n\n\ttoShapes( isCCW ) {\n\n\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\tconst shapes = [];\n\n\t\t\tfor ( let i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\tconst tmpPath = inSubpaths[ i ];\n\n\t\t\t\tconst 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\tconst 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\tlet inside = false;\n\t\t\tfor ( let p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\tlet edgeLowPt = inPolygon[ p ];\n\t\t\t\tlet edgeHighPt = inPolygon[ q ];\n\n\t\t\t\tlet edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\tlet 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\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\tconst 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\tconst isClockWise = ShapeUtils.isClockWise;\n\n\t\tconst subPaths = this.subPaths;\n\t\tif ( subPaths.length === 0 ) return [];\n\n\t\tlet solid, tmpPath, tmpShape;\n\t\tconst 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\tlet holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\tconst betterShapeHoles = [];\n\t\tconst newShapes = [];\n\t\tlet newShapeHoles = [];\n\t\tlet mainIdx = 0;\n\t\tlet tmpPoints;\n\n\t\tnewShapes[ mainIdx ] = undefined;\n\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\tfor ( let 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\tlet ambiguous = false;\n\t\t\tlet toChange = 0;\n\n\t\t\tfor ( let 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 ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tconst sho = newShapeHoles[ sIdx ];\n\n\t\t\t\tfor ( let hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\tconst ho = sho[ hIdx ];\n\t\t\t\t\tlet hole_unassigned = true;\n\n\t\t\t\t\tfor ( let 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 ++;\n\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\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\n\t\t\tif ( toChange > 0 && ambiguous === false ) {\n\n\t\t\t\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet tmpHoles;\n\n\t\tfor ( let 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 ( let 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\nif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: {\n\t\trevision: REVISION,\n\t} } ) );\n\n}\n\nif ( typeof window !== 'undefined' ) {\n\n\tif ( window.__THREE__ ) {\n\n\t\tconsole.warn( 'WARNING: Multiple instances of Three.js being imported.' );\n\n\t} else {\n\n\t\twindow.__THREE__ = REVISION;\n\n\t}\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveAnimationBlendMode, AdditiveBlending, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrayCamera, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BackSide, BasicDepthPacking, BasicShadowMap, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxGeometry, BoxHelper, BufferAttribute, BufferGeometry, BufferGeometryLoader, ByteType, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CineonToneMapping, CircleGeometry, ClampToEdgeWrapping, Clock, Color, ColorKeyframeTrack, ColorManagement, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, ConstantAlphaFactor, ConstantColorFactor, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureLoader, CubeUVReflectionMapping, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceBack, CullFaceFront, CullFaceFrontBack, CullFaceNone, Curve, CurvePath, CustomBlending, CustomToneMapping, CylinderGeometry, Cylindrical, Data3DTexture, DataArrayTexture, DataTexture, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DepthFormat, DepthStencilFormat, DepthTexture, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DisplayP3ColorSpace, DodecahedronGeometry, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualCompare, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Float32BufferAttribute, Float64BufferAttribute, FloatType, Fog, FogExp2, FramebufferTexture, FrontSide, Frustum, GLBufferAttribute, GLSL1, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HalfFloatType, HemisphereLight, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, IntType, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearDisplayP3ColorSpace, LinearEncoding, LinearFilter, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, LuminanceAlphaFormat, LuminanceFormat, MOUSE, Material, MaterialLoader, MathUtils, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoToneMapping, NormalAnimationBlendMode, NormalBlending, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, ObjectSpaceNormalMap, OctahedronGeometry, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, P3Primaries, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, Path, PerspectiveCamera, Plane, PlaneGeometry, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_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_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RawShaderMaterial, Ray, Raycaster, Rec709Primaries, RectAreaLight, RedFormat, RedIntegerFormat, ReinhardToneMapping, RenderTarget, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RingGeometry, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, Scene, ShaderChunk, ShaderLib, ShaderMaterial, ShadowMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, ShortType, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, SubtractEquation, SubtractiveBlending, TOUCH, TangentSpaceNormalMap, TetrahedronGeometry, Texture, TextureLoader, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, TwoPassDoubleSide, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, UniformsLib, UniformsUtils, UnsignedByteType, UnsignedInt248Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, VectorKeyframeTrack, VideoTexture, WebGL1Renderer, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGLMultipleRenderTargets, WebGLRenderTarget, WebGLRenderer, WebGLUtils, WebGPUCoordinateSystem, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroFactor, ZeroSlopeEnding, ZeroStencilOp, _SRGBAFormat, createCanvasElement, sRGBEncoding };\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tInstancedBufferAttribute,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tTrianglesDrawMode,\n\tVector3,\n} from 'three';\n\nfunction computeMikkTSpaceTangents( geometry, MikkTSpace, negateSign = true ) {\n\n\tif ( ! MikkTSpace || ! MikkTSpace.isReady ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Initialized MikkTSpace library required.' );\n\n\t}\n\n\tif ( ! geometry.hasAttribute( 'position' ) || ! geometry.hasAttribute( 'normal' ) || ! geometry.hasAttribute( 'uv' ) ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Tangents require \"position\", \"normal\", and \"uv\" attributes.' );\n\n\t}\n\n\tfunction getAttributeArray( attribute ) {\n\n\t\tif ( attribute.normalized || attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst dstArray = new Float32Array( attribute.count * attribute.itemSize );\n\n\t\t\tfor ( let i = 0, j = 0; i < attribute.count; i ++ ) {\n\n\t\t\t\tdstArray[ j ++ ] = attribute.getX( i );\n\t\t\t\tdstArray[ j ++ ] = attribute.getY( i );\n\n\t\t\t\tif ( attribute.itemSize > 2 ) {\n\n\t\t\t\t\tdstArray[ j ++ ] = attribute.getZ( i );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t\tif ( attribute.array instanceof Float32Array ) {\n\n\t\t\treturn attribute.array;\n\n\t\t}\n\n\t\treturn new Float32Array( attribute.array );\n\n\t}\n\n\t// MikkTSpace algorithm requires non-indexed input.\n\n\tconst _geometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\n\t// Compute vertex tangents.\n\n\tconst tangents = MikkTSpace.generateTangents(\n\n\t\tgetAttributeArray( _geometry.attributes.position ),\n\t\tgetAttributeArray( _geometry.attributes.normal ),\n\t\tgetAttributeArray( _geometry.attributes.uv )\n\n\t);\n\n\t// Texture coordinate convention of glTF differs from the apparent\n\t// default of the MikkTSpace library; .w component must be flipped.\n\n\tif ( negateSign ) {\n\n\t\tfor ( let i = 3; i < tangents.length; i += 4 ) {\n\n\t\t\ttangents[ i ] *= - 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\t_geometry.setAttribute( 'tangent', new BufferAttribute( tangents, 4 ) );\n\n\tif ( geometry !== _geometry ) {\n\n\t\tgeometry.copy( _geometry );\n\n\t}\n\n\treturn geometry;\n\n}\n\n/**\n * @param {Array<BufferGeometry>} geometries\n * @param {Boolean} useGroups\n * @return {BufferGeometry}\n */\nfunction mergeGeometries( geometries, useGroups = false ) {\n\n\tconst isIndexed = geometries[ 0 ].index !== null;\n\n\tconst attributesUsed = new Set( Object.keys( geometries[ 0 ].attributes ) );\n\tconst morphAttributesUsed = new Set( Object.keys( geometries[ 0 ].morphAttributes ) );\n\n\tconst attributes = {};\n\tconst morphAttributes = {};\n\n\tconst morphTargetsRelative = geometries[ 0 ].morphTargetsRelative;\n\n\tconst mergedGeometry = new BufferGeometry();\n\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\tconst geometry = geometries[ i ];\n\t\tlet attributesCount = 0;\n\n\t\t// ensure that all geometries are indexed, or none\n\n\t\tif ( isIndexed !== ( geometry.index !== null ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather attributes, exit early if they're different\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tif ( ! attributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( attributes[ name ] === undefined ) attributes[ name ] = [];\n\n\t\t\tattributes[ name ].push( geometry.attributes[ name ] );\n\n\t\t\tattributesCount ++;\n\n\t\t}\n\n\t\t// ensure geometries have the same number of attributes\n\n\t\tif ( attributesCount !== attributesUsed.size ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. Make sure all geometries have the same number of attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather morph attributes, exit early if they're different\n\n\t\tif ( morphTargetsRelative !== geometry.morphTargetsRelative ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphTargetsRelative must be consistent throughout all geometries.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tfor ( const name in geometry.morphAttributes ) {\n\n\t\t\tif ( ! morphAttributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphAttributes must be consistent throughout all geometries.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( morphAttributes[ name ] === undefined ) morphAttributes[ name ] = [];\n\n\t\t\tmorphAttributes[ name ].push( geometry.morphAttributes[ name ] );\n\n\t\t}\n\n\t\tif ( useGroups ) {\n\n\t\t\tlet count;\n\n\t\t\tif ( isIndexed ) {\n\n\t\t\t\tcount = geometry.index.count;\n\n\t\t\t} else if ( geometry.attributes.position !== undefined ) {\n\n\t\t\t\tcount = geometry.attributes.position.count;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. The geometry must have either an index or a position attribute' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.addGroup( offset, count, i );\n\n\t\t\toffset += count;\n\n\t\t}\n\n\t}\n\n\t// merge indices\n\n\tif ( isIndexed ) {\n\n\t\tlet indexOffset = 0;\n\t\tconst mergedIndex = [];\n\n\t\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\t\tconst index = geometries[ i ].index;\n\n\t\t\tfor ( let j = 0; j < index.count; ++ j ) {\n\n\t\t\t\tmergedIndex.push( index.getX( j ) + indexOffset );\n\n\t\t\t}\n\n\t\t\tindexOffset += geometries[ i ].attributes.position.count;\n\n\t\t}\n\n\t\tmergedGeometry.setIndex( mergedIndex );\n\n\t}\n\n\t// merge attributes\n\n\tfor ( const name in attributes ) {\n\n\t\tconst mergedAttribute = mergeAttributes( attributes[ name ] );\n\n\t\tif ( ! mergedAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' attribute.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tmergedGeometry.setAttribute( name, mergedAttribute );\n\n\t}\n\n\t// merge morph attributes\n\n\tfor ( const name in morphAttributes ) {\n\n\t\tconst numMorphTargets = morphAttributes[ name ][ 0 ].length;\n\n\t\tif ( numMorphTargets === 0 ) break;\n\n\t\tmergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n\t\tmergedGeometry.morphAttributes[ name ] = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; ++ i ) {\n\n\t\t\tconst morphAttributesToMerge = [];\n\n\t\t\tfor ( let j = 0; j < morphAttributes[ name ].length; ++ j ) {\n\n\t\t\t\tmorphAttributesToMerge.push( morphAttributes[ name ][ j ][ i ] );\n\n\t\t\t}\n\n\t\t\tconst mergedMorphAttribute = mergeAttributes( morphAttributesToMerge );\n\n\t\t\tif ( ! mergedMorphAttribute ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' morphAttribute.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.morphAttributes[ name ].push( mergedMorphAttribute );\n\n\t\t}\n\n\t}\n\n\treturn mergedGeometry;\n\n}\n\n/**\n * @param {Array<BufferAttribute>} attributes\n * @return {BufferAttribute}\n */\nfunction mergeAttributes( attributes ) {\n\n\tlet TypedArray;\n\tlet itemSize;\n\tlet normalized;\n\tlet gpuType = - 1;\n\tlet arrayLength = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. InterleavedBufferAttributes are not supported.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( itemSize === undefined ) itemSize = attribute.itemSize;\n\t\tif ( itemSize !== attribute.itemSize ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( normalized === undefined ) normalized = attribute.normalized;\n\t\tif ( normalized !== attribute.normalized ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( gpuType === - 1 ) gpuType = attribute.gpuType;\n\t\tif ( gpuType !== attribute.gpuType ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.array.length;\n\n\t}\n\n\tconst array = new TypedArray( arrayLength );\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tarray.set( attributes[ i ].array, offset );\n\n\t\toffset += attributes[ i ].array.length;\n\n\t}\n\n\tconst result = new BufferAttribute( array, itemSize, normalized );\n\tif ( gpuType !== undefined ) {\n\n\t\tresult.gpuType = gpuType;\n\n\t}\n\n\treturn result;\n\n}\n\n/**\n * @param {BufferAttribute}\n * @return {BufferAttribute}\n */\nexport function deepCloneAttribute( attribute ) {\n\n\tif ( attribute.isInstancedInterleavedBufferAttribute || attribute.isInterleavedBufferAttribute ) {\n\n\t\treturn deinterleaveAttribute( attribute );\n\n\t}\n\n\tif ( attribute.isInstancedBufferAttribute ) {\n\n\t\treturn new InstancedBufferAttribute().copy( attribute );\n\n\t}\n\n\treturn new BufferAttribute().copy( attribute );\n\n}\n\n/**\n * @param {Array<BufferAttribute>} attributes\n * @return {Array<InterleavedBufferAttribute>}\n */\nfunction interleaveAttributes( attributes ) {\n\n\t// Interleaves the provided attributes into an InterleavedBuffer and returns\n\t// a set of InterleavedBufferAttributes for each attribute\n\tlet TypedArray;\n\tlet arrayLength = 0;\n\tlet stride = 0;\n\n\t// calculate the length and type of the interleavedBuffer\n\tfor ( let i = 0, l = attributes.length; i < l; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'AttributeBuffers of different types cannot be interleaved' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.array.length;\n\t\tstride += attribute.itemSize;\n\n\t}\n\n\t// Create the set of buffer attributes\n\tconst interleavedBuffer = new InterleavedBuffer( new TypedArray( arrayLength ), stride );\n\tlet offset = 0;\n\tconst res = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\tfor ( let j = 0, l = attributes.length; j < l; j ++ ) {\n\n\t\tconst attribute = attributes[ j ];\n\t\tconst itemSize = attribute.itemSize;\n\t\tconst count = attribute.count;\n\t\tconst iba = new InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, attribute.normalized );\n\t\tres.push( iba );\n\n\t\toffset += itemSize;\n\n\t\t// Move the data for each attribute into the new interleavedBuffer\n\t\t// at the appropriate offset\n\t\tfor ( let c = 0; c < count; c ++ ) {\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\tiba[ setters[ k ] ]( c, attribute[ getters[ k ] ]( c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn res;\n\n}\n\n// returns a new, non-interleaved version of the provided attribute\nexport function deinterleaveAttribute( attribute ) {\n\n\tconst cons = attribute.data.array.constructor;\n\tconst count = attribute.count;\n\tconst itemSize = attribute.itemSize;\n\tconst normalized = attribute.normalized;\n\n\tconst array = new cons( count * itemSize );\n\tlet newAttribute;\n\tif ( attribute.isInstancedInterleavedBufferAttribute ) {\n\n\t\tnewAttribute = new InstancedBufferAttribute( array, itemSize, normalized, attribute.meshPerAttribute );\n\n\t} else {\n\n\t\tnewAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t}\n\n\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\tnewAttribute.setX( i, attribute.getX( i ) );\n\n\t\tif ( itemSize >= 2 ) {\n\n\t\t\tnewAttribute.setY( i, attribute.getY( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 3 ) {\n\n\t\t\tnewAttribute.setZ( i, attribute.getZ( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 4 ) {\n\n\t\t\tnewAttribute.setW( i, attribute.getW( i ) );\n\n\t\t}\n\n\t}\n\n\treturn newAttribute;\n\n}\n\n// deinterleaves all attributes on the geometry\nexport function deinterleaveGeometry( geometry ) {\n\n\tconst attributes = geometry.attributes;\n\tconst morphTargets = geometry.morphTargets;\n\tconst attrMap = new Map();\n\n\tfor ( const key in attributes ) {\n\n\t\tconst attr = attributes[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tattributes[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n\tfor ( const key in morphTargets ) {\n\n\t\tconst attr = morphTargets[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tmorphTargets[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @return {number}\n */\nfunction estimateBytesUsed( geometry ) {\n\n\t// Return the estimated memory used by this geometry in bytes\n\t// Calculate using itemSize, count, and BYTES_PER_ELEMENT to account\n\t// for InterleavedBufferAttributes.\n\tlet mem = 0;\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst attr = geometry.getAttribute( name );\n\t\tmem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n\n\t}\n\n\tconst indices = geometry.getIndex();\n\tmem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n\treturn mem;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} tolerance\n * @return {BufferGeometry}\n */\nfunction mergeVertices( geometry, tolerance = 1e-4 ) {\n\n\ttolerance = Math.max( tolerance, Number.EPSILON );\n\n\t// Generate an index buffer if the geometry doesn't have one, or optimize it\n\t// if it's already available.\n\tconst hashToIndex = {};\n\tconst indices = geometry.getIndex();\n\tconst positions = geometry.getAttribute( 'position' );\n\tconst vertexCount = indices ? indices.count : positions.count;\n\n\t// next value for triangle indices\n\tlet nextIndex = 0;\n\n\t// attributes and new attribute arrays\n\tconst attributeNames = Object.keys( geometry.attributes );\n\tconst tmpAttributes = {};\n\tconst tmpMorphAttributes = {};\n\tconst newIndices = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\t// Initialize the arrays, allocating space conservatively. Extra\n\t// space will be trimmed in the last step.\n\tfor ( let i = 0, l = attributeNames.length; i < l; i ++ ) {\n\n\t\tconst name = attributeNames[ i ];\n\t\tconst attr = geometry.attributes[ name ];\n\n\t\ttmpAttributes[ name ] = new BufferAttribute(\n\t\t\tnew attr.array.constructor( attr.count * attr.itemSize ),\n\t\t\tattr.itemSize,\n\t\t\tattr.normalized\n\t\t);\n\n\t\tconst morphAttr = geometry.morphAttributes[ name ];\n\t\tif ( morphAttr ) {\n\n\t\t\ttmpMorphAttributes[ name ] = new BufferAttribute(\n\t\t\t\tnew morphAttr.array.constructor( morphAttr.count * morphAttr.itemSize ),\n\t\t\t\tmorphAttr.itemSize,\n\t\t\t\tmorphAttr.normalized\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\t// convert the error tolerance to an amount of decimal places to truncate to\n\tconst halfTolerance = tolerance * 0.5;\n\tconst exponent = Math.log10( 1 / tolerance );\n\tconst hashMultiplier = Math.pow( 10, exponent );\n\tconst hashAdditive = halfTolerance * hashMultiplier;\n\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\tconst index = indices ? indices.getX( i ) : i;\n\n\t\t// Generate a hash for the vertex attributes at the current index 'i'\n\t\tlet hash = '';\n\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\tconst name = attributeNames[ j ];\n\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\tconst itemSize = attribute.itemSize;\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t// double tilde truncates the decimal value\n\t\t\t\thash += `${ ~ ~ ( attribute[ getters[ k ] ]( index ) * hashMultiplier + hashAdditive ) },`;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add another reference to the vertex if it's already\n\t\t// used by another index\n\t\tif ( hash in hashToIndex ) {\n\n\t\t\tnewIndices.push( hashToIndex[ hash ] );\n\n\t\t} else {\n\n\t\t\t// copy data to the new index in the temporary attributes\n\t\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\t\tconst name = attributeNames[ j ];\n\t\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\t\tconst morphAttr = geometry.morphAttributes[ name ];\n\t\t\t\tconst itemSize = attribute.itemSize;\n\t\t\t\tconst newarray = tmpAttributes[ name ];\n\t\t\t\tconst newMorphArrays = tmpMorphAttributes[ name ];\n\n\t\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t\tconst getterFunc = getters[ k ];\n\t\t\t\t\tconst setterFunc = setters[ k ];\n\t\t\t\t\tnewarray[ setterFunc ]( nextIndex, attribute[ getterFunc ]( index ) );\n\n\t\t\t\t\tif ( morphAttr ) {\n\n\t\t\t\t\t\tfor ( let m = 0, ml = morphAttr.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\t\tnewMorphArrays[ m ][ setterFunc ]( nextIndex, morphAttr[ m ][ getterFunc ]( index ) );\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\thashToIndex[ hash ] = nextIndex;\n\t\t\tnewIndices.push( nextIndex );\n\t\t\tnextIndex ++;\n\n\t\t}\n\n\t}\n\n\t// generate result BufferGeometry\n\tconst result = geometry.clone();\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst tmpAttribute = tmpAttributes[ name ];\n\n\t\tresult.setAttribute( name, new BufferAttribute(\n\t\t\ttmpAttribute.array.slice( 0, nextIndex * tmpAttribute.itemSize ),\n\t\t\ttmpAttribute.itemSize,\n\t\t\ttmpAttribute.normalized,\n\t\t) );\n\n\t\tif ( ! ( name in tmpMorphAttributes ) ) continue;\n\n\t\tfor ( let j = 0; j < tmpMorphAttributes[ name ].length; j ++ ) {\n\n\t\t\tconst tmpMorphAttribute = tmpMorphAttributes[ name ][ j ];\n\n\t\t\tresult.morphAttributes[ name ][ j ] = new BufferAttribute(\n\t\t\t\ttmpMorphAttribute.array.slice( 0, nextIndex * tmpMorphAttribute.itemSize ),\n\t\t\t\ttmpMorphAttribute.itemSize,\n\t\t\t\ttmpMorphAttribute.normalized,\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\t// indices\n\n\tresult.setIndex( newIndices );\n\n\treturn result;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} drawMode\n * @return {BufferGeometry}\n */\nfunction toTrianglesDrawMode( geometry, drawMode ) {\n\n\tif ( drawMode === TrianglesDrawMode ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.' );\n\t\treturn geometry;\n\n\t}\n\n\tif ( drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode ) {\n\n\t\tlet index = geometry.getIndex();\n\n\t\t// generate index if not present\n\n\t\tif ( index === null ) {\n\n\t\t\tconst indices = [];\n\n\t\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tfor ( let i = 0; i < position.count; i ++ ) {\n\n\t\t\t\t\tindices.push( i );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setIndex( indices );\n\t\t\t\tindex = geometry.getIndex();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst numberOfTriangles = index.count - 2;\n\t\tconst newIndices = [];\n\n\t\tif ( drawMode === TriangleFanDrawMode ) {\n\n\t\t\t// gl.TRIANGLE_FAN\n\n\t\t\tfor ( let i = 1; i <= numberOfTriangles; i ++ ) {\n\n\t\t\t\tnewIndices.push( index.getX( 0 ) );\n\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// gl.TRIANGLE_STRIP\n\n\t\t\tfor ( let i = 0; i < numberOfTriangles; i ++ ) {\n\n\t\t\t\tif ( i % 2 === 0 ) {\n\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( ( newIndices.length / 3 ) !== numberOfTriangles ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );\n\n\t\t}\n\n\t\t// build final geometry\n\n\t\tconst newGeometry = geometry.clone();\n\t\tnewGeometry.setIndex( newIndices );\n\t\tnewGeometry.clearGroups();\n\n\t\treturn newGeometry;\n\n\t} else {\n\n\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:', drawMode );\n\t\treturn geometry;\n\n\t}\n\n}\n\n/**\n * Calculates the morphed attributes of a morphed/skinned BufferGeometry.\n * Helpful for Raytracing or Decals.\n * @param {Mesh | Line | Points} object An instance of Mesh, Line or Points.\n * @return {Object} An Object with original position/normal attributes and morphed ones.\n */\nfunction computeMorphedAttributes( object ) {\n\n\tconst _vA = new Vector3();\n\tconst _vB = new Vector3();\n\tconst _vC = new Vector3();\n\n\tconst _tempA = new Vector3();\n\tconst _tempB = new Vector3();\n\tconst _tempC = new Vector3();\n\n\tconst _morphA = new Vector3();\n\tconst _morphB = new Vector3();\n\tconst _morphC = new Vector3();\n\n\tfunction _calculateMorphedAttributeData(\n\t\tobject,\n\t\tattribute,\n\t\tmorphAttribute,\n\t\tmorphTargetsRelative,\n\t\ta,\n\t\tb,\n\t\tc,\n\t\tmodifiedAttributeArray\n\t) {\n\n\t\t_vA.fromBufferAttribute( attribute, a );\n\t\t_vB.fromBufferAttribute( attribute, b );\n\t\t_vC.fromBufferAttribute( attribute, c );\n\n\t\tconst morphInfluences = object.morphTargetInfluences;\n\n\t\tif ( morphAttribute && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\t\t\t_morphB.set( 0, 0, 0 );\n\t\t\t_morphC.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morph = morphAttribute[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morph, a );\n\t\t\t\t_tempB.fromBufferAttribute( morph, b );\n\t\t\t\t_tempC.fromBufferAttribute( morph, c );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB, influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( _vA ), influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB.sub( _vB ), influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC.sub( _vC ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_vA.add( _morphA );\n\t\t\t_vB.add( _morphB );\n\t\t\t_vC.add( _morphC );\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tobject.applyBoneTransform( a, _vA );\n\t\t\tobject.applyBoneTransform( b, _vB );\n\t\t\tobject.applyBoneTransform( c, _vC );\n\n\t\t}\n\n\t\tmodifiedAttributeArray[ a * 3 + 0 ] = _vA.x;\n\t\tmodifiedAttributeArray[ a * 3 + 1 ] = _vA.y;\n\t\tmodifiedAttributeArray[ a * 3 + 2 ] = _vA.z;\n\t\tmodifiedAttributeArray[ b * 3 + 0 ] = _vB.x;\n\t\tmodifiedAttributeArray[ b * 3 + 1 ] = _vB.y;\n\t\tmodifiedAttributeArray[ b * 3 + 2 ] = _vB.z;\n\t\tmodifiedAttributeArray[ c * 3 + 0 ] = _vC.x;\n\t\tmodifiedAttributeArray[ c * 3 + 1 ] = _vC.y;\n\t\tmodifiedAttributeArray[ c * 3 + 2 ] = _vC.z;\n\n\t}\n\n\tconst geometry = object.geometry;\n\tconst material = object.material;\n\n\tlet a, b, c;\n\tconst index = geometry.index;\n\tconst positionAttribute = geometry.attributes.position;\n\tconst morphPosition = geometry.morphAttributes.position;\n\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\tconst normalAttribute = geometry.attributes.normal;\n\tconst morphNormal = geometry.morphAttributes.position;\n\n\tconst groups = geometry.groups;\n\tconst drawRange = geometry.drawRange;\n\tlet i, j, il, jl;\n\tlet group;\n\tlet start, end;\n\n\tconst modifiedPosition = new Float32Array( positionAttribute.count * positionAttribute.itemSize );\n\tconst modifiedNormal = new Float32Array( normalAttribute.count * normalAttribute.itemSize );\n\n\tif ( index !== null ) {\n\n\t\t// indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = index.getX( j );\n\t\t\t\t\tb = index.getX( j + 1 );\n\t\t\t\t\tc = index.getX( j + 2 );\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\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\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = index.getX( i );\n\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// non-indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = j;\n\t\t\t\t\tb = j + 1;\n\t\t\t\t\tc = j + 2;\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\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\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = i;\n\t\t\t\tb = i + 1;\n\t\t\t\tc = i + 2;\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst morphedPositionAttribute = new Float32BufferAttribute( modifiedPosition, 3 );\n\tconst morphedNormalAttribute = new Float32BufferAttribute( modifiedNormal, 3 );\n\n\treturn {\n\n\t\tpositionAttribute: positionAttribute,\n\t\tnormalAttribute: normalAttribute,\n\t\tmorphedPositionAttribute: morphedPositionAttribute,\n\t\tmorphedNormalAttribute: morphedNormalAttribute\n\n\t};\n\n}\n\nfunction mergeGroups( geometry ) {\n\n\tif ( geometry.groups.length === 0 ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.mergeGroups(): No groups are defined. Nothing to merge.' );\n\t\treturn geometry;\n\n\t}\n\n\tlet groups = geometry.groups;\n\n\t// sort groups by material index\n\n\tgroups = groups.sort( ( a, b ) => {\n\n\t\tif ( a.materialIndex !== b.materialIndex ) return a.materialIndex - b.materialIndex;\n\n\t\treturn a.start - b.start;\n\n\t} );\n\n\t// create index for non-indexed geometries\n\n\tif ( geometry.getIndex() === null ) {\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\t\tconst indices = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i += 3 ) {\n\n\t\t\tindices.push( i, i + 1, i + 2 );\n\n\t\t}\n\n\t\tgeometry.setIndex( indices );\n\n\t}\n\n\t// sort index\n\n\tconst index = geometry.getIndex();\n\n\tconst newIndices = [];\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tconst groupStart = group.start;\n\t\tconst groupLength = groupStart + group.count;\n\n\t\tfor ( let j = groupStart; j < groupLength; j ++ ) {\n\n\t\t\tnewIndices.push( index.getX( j ) );\n\n\t\t}\n\n\t}\n\n\tgeometry.dispose(); // Required to force buffer recreation\n\tgeometry.setIndex( newIndices );\n\n\t// update groups indices\n\n\tlet start = 0;\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tgroup.start = start;\n\t\tstart += group.count;\n\n\t}\n\n\t// merge groups\n\n\tlet currentGroup = groups[ 0 ];\n\n\tgeometry.groups = [ currentGroup ];\n\n\tfor ( let i = 1; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tif ( currentGroup.materialIndex === group.materialIndex ) {\n\n\t\t\tcurrentGroup.count += group.count;\n\n\t\t} else {\n\n\t\t\tcurrentGroup = group;\n\t\t\tgeometry.groups.push( currentGroup );\n\n\t\t}\n\n\t}\n\n\treturn geometry;\n\n}\n\n\n/**\n * Modifies the supplied geometry if it is non-indexed, otherwise creates a new,\n * non-indexed geometry. Returns the geometry with smooth normals everywhere except\n * faces that meet at an angle greater than the crease angle.\n *\n * @param {BufferGeometry} geometry\n * @param {number} [creaseAngle]\n * @return {BufferGeometry}\n */\nfunction toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */ ) {\n\n\tconst creaseDot = Math.cos( creaseAngle );\n\tconst hashMultiplier = ( 1 + 1e-10 ) * 1e2;\n\n\t// reusable vectors\n\tconst verts = [ new Vector3(), new Vector3(), new Vector3() ];\n\tconst tempVec1 = new Vector3();\n\tconst tempVec2 = new Vector3();\n\tconst tempNorm = new Vector3();\n\tconst tempNorm2 = new Vector3();\n\n\t// hashes a vector\n\tfunction hashVertex( v ) {\n\n\t\tconst x = ~ ~ ( v.x * hashMultiplier );\n\t\tconst y = ~ ~ ( v.y * hashMultiplier );\n\t\tconst z = ~ ~ ( v.z * hashMultiplier );\n\t\treturn `${x},${y},${z}`;\n\n\t}\n\n\t// BufferGeometry.toNonIndexed() warns if the geometry is non-indexed\n\t// and returns the original geometry\n\tconst resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\tconst posAttr = resultGeometry.attributes.position;\n\tconst vertexMap = {};\n\n\t// find all the normals shared by commonly located vertices\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\t// add the normal to the map for all vertices\n\t\tconst normal = new Vector3().crossVectors( tempVec1, tempVec2 ).normalize();\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tif ( ! ( hash in vertexMap ) ) {\n\n\t\t\t\tvertexMap[ hash ] = [];\n\n\t\t\t}\n\n\t\t\tvertexMap[ hash ].push( normal );\n\n\t\t}\n\n\t}\n\n\t// average normals from all vertices that share a common location if they are within the\n\t// provided crease threshold\n\tconst normalArray = new Float32Array( posAttr.count * 3 );\n\tconst normAttr = new BufferAttribute( normalArray, 3, false );\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\t// get the face normal for this vertex\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\ttempNorm.crossVectors( tempVec1, tempVec2 ).normalize();\n\n\t\t// average all normals that meet the threshold and set the normal value\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tconst otherNormals = vertexMap[ hash ];\n\t\t\ttempNorm2.set( 0, 0, 0 );\n\n\t\t\tfor ( let k = 0, lk = otherNormals.length; k < lk; k ++ ) {\n\n\t\t\t\tconst otherNorm = otherNormals[ k ];\n\t\t\t\tif ( tempNorm.dot( otherNorm ) > creaseDot ) {\n\n\t\t\t\t\ttempNorm2.add( otherNorm );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttempNorm2.normalize();\n\t\t\tnormAttr.setXYZ( i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z );\n\n\t\t}\n\n\t}\n\n\tresultGeometry.setAttribute( 'normal', normAttr );\n\treturn resultGeometry;\n\n}\n\nfunction mergeBufferGeometries( geometries, useGroups = false ) {\n\n\tconsole.warn( 'THREE.BufferGeometryUtils: mergeBufferGeometries() has been renamed to mergeGeometries().' ); // @deprecated, r151\n\treturn mergeGeometries( geometries, useGroups );\n\n}\n\nfunction mergeBufferAttributes( attributes ) {\n\n\tconsole.warn( 'THREE.BufferGeometryUtils: mergeBufferAttributes() has been renamed to mergeAttributes().' ); // @deprecated, r151\n\treturn mergeAttributes( attributes );\n\n}\n\nexport {\n\tcomputeMikkTSpaceTangents,\n\tmergeGeometries,\n\tmergeBufferGeometries,\n\tmergeAttributes,\n\tmergeBufferAttributes,\n\tinterleaveAttributes,\n\testimateBytesUsed,\n\tmergeVertices,\n\ttoTrianglesDrawMode,\n\tcomputeMorphedAttributes,\n\tmergeGroups,\n\ttoCreasedNormals\n};\n","import {\n\tAnimationClip,\n\tBone,\n\tBox3,\n\tBufferAttribute,\n\tBufferGeometry,\n\tClampToEdgeWrapping,\n\tColor,\n\tColorManagement,\n\tDirectionalLight,\n\tDoubleSide,\n\tFileLoader,\n\tFrontSide,\n\tGroup,\n\tImageBitmapLoader,\n\tInstancedMesh,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tInterpolant,\n\tInterpolateDiscrete,\n\tInterpolateLinear,\n\tLine,\n\tLineBasicMaterial,\n\tLineLoop,\n\tLineSegments,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearMipmapNearestFilter,\n\tLinearSRGBColorSpace,\n\tLoader,\n\tLoaderUtils,\n\tMaterial,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tMeshPhysicalMaterial,\n\tMeshStandardMaterial,\n\tMirroredRepeatWrapping,\n\tNearestFilter,\n\tNearestMipmapLinearFilter,\n\tNearestMipmapNearestFilter,\n\tNumberKeyframeTrack,\n\tObject3D,\n\tOrthographicCamera,\n\tPerspectiveCamera,\n\tPointLight,\n\tPoints,\n\tPointsMaterial,\n\tPropertyBinding,\n\tQuaternion,\n\tQuaternionKeyframeTrack,\n\tRepeatWrapping,\n\tSkeleton,\n\tSkinnedMesh,\n\tSphere,\n\tSpotLight,\n\tTexture,\n\tTextureLoader,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tVector2,\n\tVector3,\n\tVectorKeyframeTrack,\n\tSRGBColorSpace,\n\tInstancedBufferAttribute\n} from 'three';\nimport { toTrianglesDrawMode } from '../utils/BufferGeometryUtils.js';\n\nclass GLTFLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.dracoLoader = null;\n\t\tthis.ktx2Loader = null;\n\t\tthis.meshoptDecoder = null;\n\n\t\tthis.pluginCallbacks = [];\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsClearcoatExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureBasisUExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureWebPExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureAVIFExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSheenExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsTransmissionExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsVolumeExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIorExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsEmissiveStrengthExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSpecularExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIridescenceExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsAnisotropyExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFLightsExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshoptCompression( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshGpuInstancing( parser );\n\n\t\t} );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet resourcePath;\n\n\t\tif ( this.resourcePath !== '' ) {\n\n\t\t\tresourcePath = this.resourcePath;\n\n\t\t} else if ( this.path !== '' ) {\n\n\t\t\tresourcePath = this.path;\n\n\t\t} else {\n\n\t\t\tresourcePath = LoaderUtils.extractUrlBase( url );\n\n\t\t}\n\n\t\t// Tells the LoadingManager to track an extra item, which resolves after\n\t\t// the model is fully loaded. This means the count of items loaded will\n\t\t// be incorrect, but ensures manager.onLoad() does not fire early.\n\t\tthis.manager.itemStart( url );\n\n\t\tconst _onError = function ( e ) {\n\n\t\t\tif ( onError ) {\n\n\t\t\t\tonError( e );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t};\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, function ( data ) {\n\n\t\t\ttry {\n\n\t\t\t\tscope.parse( data, resourcePath, function ( gltf ) {\n\n\t\t\t\t\tonLoad( gltf );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, _onError );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\t_onError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, _onError );\n\n\t}\n\n\tsetDRACOLoader( dracoLoader ) {\n\n\t\tthis.dracoLoader = dracoLoader;\n\t\treturn this;\n\n\t}\n\n\tsetDDSLoader() {\n\n\t\tthrow new Error(\n\n\t\t\t'THREE.GLTFLoader: \"MSFT_texture_dds\" no longer supported. Please update to \"KHR_texture_basisu\".'\n\n\t\t);\n\n\t}\n\n\tsetKTX2Loader( ktx2Loader ) {\n\n\t\tthis.ktx2Loader = ktx2Loader;\n\t\treturn this;\n\n\t}\n\n\tsetMeshoptDecoder( meshoptDecoder ) {\n\n\t\tthis.meshoptDecoder = meshoptDecoder;\n\t\treturn this;\n\n\t}\n\n\tregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tparse( data, path, onLoad, onError ) {\n\n\t\tlet json;\n\t\tconst extensions = {};\n\t\tconst plugins = {};\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tif ( typeof data === 'string' ) {\n\n\t\t\tjson = JSON.parse( data );\n\n\t\t} else if ( data instanceof ArrayBuffer ) {\n\n\t\t\tconst magic = textDecoder.decode( new Uint8Array( data, 0, 4 ) );\n\n\t\t\tif ( magic === BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\t\ttry {\n\n\t\t\t\t\textensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\tif ( onError ) onError( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tjson = JSON.parse( extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content );\n\n\t\t\t} else {\n\n\t\t\t\tjson = JSON.parse( textDecoder.decode( data ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tjson = data;\n\n\t\t}\n\n\t\tif ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) {\n\n\t\t\tif ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst parser = new GLTFParser( json, {\n\n\t\t\tpath: path || this.resourcePath || '',\n\t\t\tcrossOrigin: this.crossOrigin,\n\t\t\trequestHeader: this.requestHeader,\n\t\t\tmanager: this.manager,\n\t\t\tktx2Loader: this.ktx2Loader,\n\t\t\tmeshoptDecoder: this.meshoptDecoder\n\n\t\t} );\n\n\t\tparser.fileLoader.setRequestHeader( this.requestHeader );\n\n\t\tfor ( let i = 0; i < this.pluginCallbacks.length; i ++ ) {\n\n\t\t\tconst plugin = this.pluginCallbacks[ i ]( parser );\n\n\t\t\tif ( ! plugin.name ) console.error( 'THREE.GLTFLoader: Invalid plugin found: missing name' );\n\n\t\t\tplugins[ plugin.name ] = plugin;\n\n\t\t\t// Workaround to avoid determining as unknown extension\n\t\t\t// in addUnknownExtensionsToUserData().\n\t\t\t// Remove this workaround if we move all the existing\n\t\t\t// extension handlers to plugin system\n\t\t\textensions[ plugin.name ] = true;\n\n\t\t}\n\n\t\tif ( json.extensionsUsed ) {\n\n\t\t\tfor ( let i = 0; i < json.extensionsUsed.length; ++ i ) {\n\n\t\t\t\tconst extensionName = json.extensionsUsed[ i ];\n\t\t\t\tconst extensionsRequired = json.extensionsRequired || [];\n\n\t\t\t\tswitch ( extensionName ) {\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_UNLIT:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsUnlitExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_TEXTURE_TRANSFORM:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFTextureTransformExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MESH_QUANTIZATION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMeshQuantizationExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Unknown extension \"' + extensionName + '\".' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tparser.setExtensions( extensions );\n\t\tparser.setPlugins( plugins );\n\t\tparser.parse( onLoad, onError );\n\n\t}\n\n\tparseAsync( data, path ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.parse( data, path, resolve, reject );\n\n\t\t} );\n\n\t}\n\n}\n\n/* GLTFREGISTRY */\n\nfunction GLTFRegistry() {\n\n\tlet objects = {};\n\n\treturn\t{\n\n\t\tget: function ( key ) {\n\n\t\t\treturn objects[ key ];\n\n\t\t},\n\n\t\tadd: function ( key, object ) {\n\n\t\t\tobjects[ key ] = object;\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete objects[ key ];\n\n\t\t},\n\n\t\tremoveAll: function () {\n\n\t\t\tobjects = {};\n\n\t\t}\n\n\t};\n\n}\n\n/*********************************/\n/********** EXTENSIONS ***********/\n/*********************************/\n\nconst EXTENSIONS = {\n\tKHR_BINARY_GLTF: 'KHR_binary_glTF',\n\tKHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression',\n\tKHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual',\n\tKHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',\n\tKHR_MATERIALS_IOR: 'KHR_materials_ior',\n\tKHR_MATERIALS_SHEEN: 'KHR_materials_sheen',\n\tKHR_MATERIALS_SPECULAR: 'KHR_materials_specular',\n\tKHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission',\n\tKHR_MATERIALS_IRIDESCENCE: 'KHR_materials_iridescence',\n\tKHR_MATERIALS_ANISOTROPY: 'KHR_materials_anisotropy',\n\tKHR_MATERIALS_UNLIT: 'KHR_materials_unlit',\n\tKHR_MATERIALS_VOLUME: 'KHR_materials_volume',\n\tKHR_TEXTURE_BASISU: 'KHR_texture_basisu',\n\tKHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',\n\tKHR_MESH_QUANTIZATION: 'KHR_mesh_quantization',\n\tKHR_MATERIALS_EMISSIVE_STRENGTH: 'KHR_materials_emissive_strength',\n\tEXT_TEXTURE_WEBP: 'EXT_texture_webp',\n\tEXT_TEXTURE_AVIF: 'EXT_texture_avif',\n\tEXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression',\n\tEXT_MESH_GPU_INSTANCING: 'EXT_mesh_gpu_instancing'\n};\n\n/**\n * Punctual Lights Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n */\nclass GLTFLightsExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL;\n\n\t\t// Object3D instance caches\n\t\tthis.cache = { refs: {}, uses: {} };\n\n\t}\n\n\t_markDefs() {\n\n\t\tconst parser = this.parser;\n\t\tconst nodeDefs = this.parser.json.nodes || [];\n\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.extensions\n\t\t\t\t\t&& nodeDef.extensions[ this.name ]\n\t\t\t\t\t&& nodeDef.extensions[ this.name ].light !== undefined ) {\n\n\t\t\t\tparser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_loadLight( lightIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst cacheKey = 'light:' + lightIndex;\n\t\tlet dependency = parser.cache.get( cacheKey );\n\n\t\tif ( dependency ) return dependency;\n\n\t\tconst json = parser.json;\n\t\tconst extensions = ( json.extensions && json.extensions[ this.name ] ) || {};\n\t\tconst lightDefs = extensions.lights || [];\n\t\tconst lightDef = lightDefs[ lightIndex ];\n\t\tlet lightNode;\n\n\t\tconst color = new Color( 0xffffff );\n\n\t\tif ( lightDef.color !== undefined ) color.setRGB( lightDef.color[ 0 ], lightDef.color[ 1 ], lightDef.color[ 2 ], LinearSRGBColorSpace );\n\n\t\tconst range = lightDef.range !== undefined ? lightDef.range : 0;\n\n\t\tswitch ( lightDef.type ) {\n\n\t\t\tcase 'directional':\n\t\t\t\tlightNode = new DirectionalLight( color );\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tcase 'point':\n\t\t\t\tlightNode = new PointLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\tbreak;\n\n\t\t\tcase 'spot':\n\t\t\t\tlightNode = new SpotLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\t// Handle spotlight properties.\n\t\t\t\tlightDef.spot = lightDef.spot || {};\n\t\t\t\tlightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0;\n\t\t\t\tlightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0;\n\t\t\t\tlightNode.angle = lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unexpected light type: ' + lightDef.type );\n\n\t\t}\n\n\t\t// Some lights (e.g. spot) default to a position other than the origin. Reset the position\n\t\t// here, because node-level parsing will only override position if explicitly specified.\n\t\tlightNode.position.set( 0, 0, 0 );\n\n\t\tlightNode.decay = 2;\n\n\t\tassignExtrasToUserData( lightNode, lightDef );\n\n\t\tif ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity;\n\n\t\tlightNode.name = parser.createUniqueName( lightDef.name || ( 'light_' + lightIndex ) );\n\n\t\tdependency = Promise.resolve( lightNode );\n\n\t\tparser.cache.add( cacheKey, dependency );\n\n\t\treturn dependency;\n\n\t}\n\n\tgetDependency( type, index ) {\n\n\t\tif ( type !== 'light' ) return;\n\n\t\treturn this._loadLight( index );\n\n\t}\n\n\tcreateNodeAttachment( nodeIndex ) {\n\n\t\tconst self = this;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\t\tconst lightDef = ( nodeDef.extensions && nodeDef.extensions[ this.name ] ) || {};\n\t\tconst lightIndex = lightDef.light;\n\n\t\tif ( lightIndex === undefined ) return null;\n\n\t\treturn this._loadLight( lightIndex ).then( function ( light ) {\n\n\t\t\treturn parser._getNodeRef( self.cache, lightIndex, light );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Unlit Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n */\nclass GLTFMaterialsUnlitExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_UNLIT;\n\n\t}\n\n\tgetMaterialType() {\n\n\t\treturn MeshBasicMaterial;\n\n\t}\n\n\textendParams( materialParams, materialDef, parser ) {\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\tmaterialParams.opacity = 1.0;\n\n\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness;\n\n\t\tif ( metallicRoughness ) {\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Emissive Strength Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/blob/5768b3ce0ef32bc39cdf1bef10b948586635ead3/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md\n */\nclass GLTFMaterialsEmissiveStrengthExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_EMISSIVE_STRENGTH;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst emissiveStrength = materialDef.extensions[ this.name ].emissiveStrength;\n\n\t\tif ( emissiveStrength !== undefined ) {\n\n\t\t\tmaterialParams.emissiveIntensity = emissiveStrength;\n\n\t\t}\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Clearcoat Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n */\nclass GLTFMaterialsClearcoatExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.clearcoatFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoat = extension.clearcoatFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatNormalTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) );\n\n\t\t\tif ( extension.clearcoatNormalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = extension.clearcoatNormalTexture.scale;\n\n\t\t\t\tmaterialParams.clearcoatNormalScale = new Vector2( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Iridescence Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_iridescence\n */\nclass GLTFMaterialsIridescenceExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IRIDESCENCE;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.iridescenceFactor !== undefined ) {\n\n\t\t\tmaterialParams.iridescence = extension.iridescenceFactor;\n\n\t\t}\n\n\t\tif ( extension.iridescenceTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceMap', extension.iridescenceTexture ) );\n\n\t\t}\n\n\t\tif ( extension.iridescenceIor !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceIOR = extension.iridescenceIor;\n\n\t\t}\n\n\t\tif ( materialParams.iridescenceThicknessRange === undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange = [ 100, 400 ];\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMinimum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 0 ] = extension.iridescenceThicknessMinimum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMaximum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 1 ] = extension.iridescenceThicknessMaximum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceThicknessMap', extension.iridescenceThicknessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Sheen Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen\n */\nclass GLTFMaterialsSheenExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SHEEN;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.sheenColor = new Color( 0, 0, 0 );\n\t\tmaterialParams.sheenRoughness = 0;\n\t\tmaterialParams.sheen = 1;\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.sheenColorFactor !== undefined ) {\n\n\t\t\tconst colorFactor = extension.sheenColorFactor;\n\t\t\tmaterialParams.sheenColor.setRGB( colorFactor[ 0 ], colorFactor[ 1 ], colorFactor[ 2 ], LinearSRGBColorSpace );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.sheenRoughness = extension.sheenRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.sheenColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenColorMap', extension.sheenColorTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenRoughnessMap', extension.sheenRoughnessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Transmission Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission\n * Draft: https://github.com/KhronosGroup/glTF/pull/1698\n */\nclass GLTFMaterialsTransmissionExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.transmissionFactor !== undefined ) {\n\n\t\t\tmaterialParams.transmission = extension.transmissionFactor;\n\n\t\t}\n\n\t\tif ( extension.transmissionTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Volume Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume\n */\nclass GLTFMaterialsVolumeExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_VOLUME;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.thickness = extension.thicknessFactor !== undefined ? extension.thicknessFactor : 0;\n\n\t\tif ( extension.thicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'thicknessMap', extension.thicknessTexture ) );\n\n\t\t}\n\n\t\tmaterialParams.attenuationDistance = extension.attenuationDistance || Infinity;\n\n\t\tconst colorArray = extension.attenuationColor || [ 1, 1, 1 ];\n\t\tmaterialParams.attenuationColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace );\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials ior Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior\n */\nclass GLTFMaterialsIorExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IOR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.ior = extension.ior !== undefined ? extension.ior : 1.5;\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Materials specular Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular\n */\nclass GLTFMaterialsSpecularExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SPECULAR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.specularIntensity = extension.specularFactor !== undefined ? extension.specularFactor : 1.0;\n\n\t\tif ( extension.specularTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularIntensityMap', extension.specularTexture ) );\n\n\t\t}\n\n\t\tconst colorArray = extension.specularColorFactor || [ 1, 1, 1 ];\n\t\tmaterialParams.specularColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace );\n\n\t\tif ( extension.specularColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularColorMap', extension.specularColorTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials anisotropy Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_anisotropy\n */\nclass GLTFMaterialsAnisotropyExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_ANISOTROPY;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.anisotropyStrength !== undefined ) {\n\n\t\t\tmaterialParams.anisotropy = extension.anisotropyStrength;\n\n\t\t}\n\n\t\tif ( extension.anisotropyRotation !== undefined ) {\n\n\t\t\tmaterialParams.anisotropyRotation = extension.anisotropyRotation;\n\n\t\t}\n\n\t\tif ( extension.anisotropyTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'anisotropyMap', extension.anisotropyTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * BasisU Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu\n */\nclass GLTFTextureBasisUExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_BASISU;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ this.name ];\n\t\tconst loader = parser.options.ktx2Loader;\n\n\t\tif ( ! loader ) {\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' );\n\n\t\t\t} else {\n\n\t\t\t\t// Assumes that the extension is optional and that a fallback texture is present\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t}\n\n}\n\n/**\n * WebP Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp\n */\nclass GLTFTextureWebPExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_WEBP;\n\t\tthis.isSupported = null;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: WebP required by asset but unsupported.' );\n\n\t\t\t}\n\n\t\t\t// Fall back to PNG or JPEG.\n\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t} );\n\n\t}\n\n\tdetectSupport() {\n\n\t\tif ( ! this.isSupported ) {\n\n\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\tconst image = new Image();\n\n\t\t\t\t// Lossy test image. Support for lossy images doesn't guarantee support for all\n\t\t\t\t// WebP images, unfortunately.\n\t\t\t\timage.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA';\n\n\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t};\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn this.isSupported;\n\n\t}\n\n}\n\n/**\n * AVIF Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_avif\n */\nclass GLTFTextureAVIFExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_AVIF;\n\t\tthis.isSupported = null;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: AVIF required by asset but unsupported.' );\n\n\t\t\t}\n\n\t\t\t// Fall back to PNG or JPEG.\n\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t} );\n\n\t}\n\n\tdetectSupport() {\n\n\t\tif ( ! this.isSupported ) {\n\n\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\tconst image = new Image();\n\n\t\t\t\t// Lossy test image.\n\t\t\t\timage.src = 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABcAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQAMAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB9tZGF0EgAKCBgABogQEDQgMgkQAAAAB8dSLfI=';\n\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t};\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn this.isSupported;\n\n\t}\n\n}\n\n/**\n * meshopt BufferView Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression\n */\nclass GLTFMeshoptCompression {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION;\n\t\tthis.parser = parser;\n\n\t}\n\n\tloadBufferView( index ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst bufferView = json.bufferViews[ index ];\n\n\t\tif ( bufferView.extensions && bufferView.extensions[ this.name ] ) {\n\n\t\t\tconst extensionDef = bufferView.extensions[ this.name ];\n\n\t\t\tconst buffer = this.parser.getDependency( 'buffer', extensionDef.buffer );\n\t\t\tconst decoder = this.parser.options.meshoptDecoder;\n\n\t\t\tif ( ! decoder || ! decoder.supported ) {\n\n\t\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Assumes that the extension is optional and that fallback buffer data is present\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn buffer.then( function ( res ) {\n\n\t\t\t\tconst byteOffset = extensionDef.byteOffset || 0;\n\t\t\t\tconst byteLength = extensionDef.byteLength || 0;\n\n\t\t\t\tconst count = extensionDef.count;\n\t\t\t\tconst stride = extensionDef.byteStride;\n\n\t\t\t\tconst source = new Uint8Array( res, byteOffset, byteLength );\n\n\t\t\t\tif ( decoder.decodeGltfBufferAsync ) {\n\n\t\t\t\t\treturn decoder.decodeGltfBufferAsync( count, stride, source, extensionDef.mode, extensionDef.filter ).then( function ( res ) {\n\n\t\t\t\t\t\treturn res.buffer;\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Support for MeshoptDecoder 0.18 or earlier, without decodeGltfBufferAsync\n\t\t\t\t\treturn decoder.ready.then( function () {\n\n\t\t\t\t\t\tconst result = new ArrayBuffer( count * stride );\n\t\t\t\t\t\tdecoder.decodeGltfBuffer( new Uint8Array( result ), count, stride, source, extensionDef.mode, extensionDef.filter );\n\t\t\t\t\t\treturn result;\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\treturn null;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * GPU Instancing Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing\n *\n */\nclass GLTFMeshGpuInstancing {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESH_GPU_INSTANCING;\n\t\tthis.parser = parser;\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( ! nodeDef.extensions || ! nodeDef.extensions[ this.name ] ||\n\t\t\tnodeDef.mesh === undefined ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst meshDef = json.meshes[ nodeDef.mesh ];\n\n\t\t// No Points or Lines + Instancing support yet\n\n\t\tfor ( const primitive of meshDef.primitives ) {\n\n\t\t\tif ( primitive.mode !== WEBGL_CONSTANTS.TRIANGLES &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_STRIP &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_FAN &&\n\t\t\t\t primitive.mode !== undefined ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst extensionDef = nodeDef.extensions[ this.name ];\n\t\tconst attributesDef = extensionDef.attributes;\n\n\t\t// @TODO: Can we support InstancedMesh + SkinnedMesh?\n\n\t\tconst pending = [];\n\t\tconst attributes = {};\n\n\t\tfor ( const key in attributesDef ) {\n\n\t\t\tpending.push( this.parser.getDependency( 'accessor', attributesDef[ key ] ).then( accessor => {\n\n\t\t\t\tattributes[ key ] = accessor;\n\t\t\t\treturn attributes[ key ];\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tif ( pending.length < 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tpending.push( this.parser.createNodeMesh( nodeIndex ) );\n\n\t\treturn Promise.all( pending ).then( results => {\n\n\t\t\tconst nodeObject = results.pop();\n\t\t\tconst meshes = nodeObject.isGroup ? nodeObject.children : [ nodeObject ];\n\t\t\tconst count = results[ 0 ].count; // All attribute counts should be same\n\t\t\tconst instancedMeshes = [];\n\n\t\t\tfor ( const mesh of meshes ) {\n\n\t\t\t\t// Temporal variables\n\t\t\t\tconst m = new Matrix4();\n\t\t\t\tconst p = new Vector3();\n\t\t\t\tconst q = new Quaternion();\n\t\t\t\tconst s = new Vector3( 1, 1, 1 );\n\n\t\t\t\tconst instancedMesh = new InstancedMesh( mesh.geometry, mesh.material, count );\n\n\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\tif ( attributes.TRANSLATION ) {\n\n\t\t\t\t\t\tp.fromBufferAttribute( attributes.TRANSLATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.ROTATION ) {\n\n\t\t\t\t\t\tq.fromBufferAttribute( attributes.ROTATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.SCALE ) {\n\n\t\t\t\t\t\ts.fromBufferAttribute( attributes.SCALE, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tinstancedMesh.setMatrixAt( i, m.compose( p, q, s ) );\n\n\t\t\t\t}\n\n\t\t\t\t// Add instance attributes to the geometry, excluding TRS.\n\t\t\t\tfor ( const attributeName in attributes ) {\n\n\t\t\t\t\tif ( attributeName === '_COLOR_0' ) {\n\n\t\t\t\t\t\tconst attr = attributes[ attributeName ];\n\t\t\t\t\t\tinstancedMesh.instanceColor = new InstancedBufferAttribute( attr.array, attr.itemSize, attr.normalized );\n\n\t\t\t\t\t} else if ( attributeName !== 'TRANSLATION' &&\n\t\t\t\t\t\t attributeName !== 'ROTATION' &&\n\t\t\t\t\t\t attributeName !== 'SCALE' ) {\n\n\t\t\t\t\t\tmesh.geometry.setAttribute( attributeName, attributes[ attributeName ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Just in case\n\t\t\t\tObject3D.prototype.copy.call( instancedMesh, mesh );\n\n\t\t\t\tthis.parser.assignFinalMaterial( instancedMesh );\n\n\t\t\t\tinstancedMeshes.push( instancedMesh );\n\n\t\t\t}\n\n\t\t\tif ( nodeObject.isGroup ) {\n\n\t\t\t\tnodeObject.clear();\n\n\t\t\t\tnodeObject.add( ... instancedMeshes );\n\n\t\t\t\treturn nodeObject;\n\n\t\t\t}\n\n\t\t\treturn instancedMeshes[ 0 ];\n\n\t\t} );\n\n\t}\n\n}\n\n/* BINARY EXTENSION */\nconst BINARY_EXTENSION_HEADER_MAGIC = 'glTF';\nconst BINARY_EXTENSION_HEADER_LENGTH = 12;\nconst BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 };\n\nclass GLTFBinaryExtension {\n\n\tconstructor( data ) {\n\n\t\tthis.name = EXTENSIONS.KHR_BINARY_GLTF;\n\t\tthis.content = null;\n\t\tthis.body = null;\n\n\t\tconst headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tthis.header = {\n\t\t\tmagic: textDecoder.decode( new Uint8Array( data.slice( 0, 4 ) ) ),\n\t\t\tversion: headerView.getUint32( 4, true ),\n\t\t\tlength: headerView.getUint32( 8, true )\n\t\t};\n\n\t\tif ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' );\n\n\t\t} else if ( this.header.version < 2.0 ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Legacy binary file detected.' );\n\n\t\t}\n\n\t\tconst chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH;\n\t\tconst chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tlet chunkIndex = 0;\n\n\t\twhile ( chunkIndex < chunkContentsLength ) {\n\n\t\t\tconst chunkLength = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tconst chunkType = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tif ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) {\n\n\t\t\t\tconst contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength );\n\t\t\t\tthis.content = textDecoder.decode( contentArray );\n\n\t\t\t} else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) {\n\n\t\t\t\tconst byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex;\n\t\t\t\tthis.body = data.slice( byteOffset, byteOffset + chunkLength );\n\n\t\t\t}\n\n\t\t\t// Clients must ignore chunks with unknown types.\n\n\t\t\tchunkIndex += chunkLength;\n\n\t\t}\n\n\t\tif ( this.content === null ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: JSON content not found.' );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * DRACO Mesh Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression\n */\nclass GLTFDracoMeshCompressionExtension {\n\n\tconstructor( json, dracoLoader ) {\n\n\t\tif ( ! dracoLoader ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' );\n\n\t\t}\n\n\t\tthis.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION;\n\t\tthis.json = json;\n\t\tthis.dracoLoader = dracoLoader;\n\t\tthis.dracoLoader.preload();\n\n\t}\n\n\tdecodePrimitive( primitive, parser ) {\n\n\t\tconst json = this.json;\n\t\tconst dracoLoader = this.dracoLoader;\n\t\tconst bufferViewIndex = primitive.extensions[ this.name ].bufferView;\n\t\tconst gltfAttributeMap = primitive.extensions[ this.name ].attributes;\n\t\tconst threeAttributeMap = {};\n\t\tconst attributeNormalizedMap = {};\n\t\tconst attributeTypeMap = {};\n\n\t\tfor ( const attributeName in gltfAttributeMap ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tthreeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ];\n\n\t\t}\n\n\t\tfor ( const attributeName in primitive.attributes ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tif ( gltfAttributeMap[ attributeName ] !== undefined ) {\n\n\t\t\t\tconst accessorDef = json.accessors[ primitive.attributes[ attributeName ] ];\n\t\t\t\tconst componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t\tattributeTypeMap[ threeAttributeName ] = componentType.name;\n\t\t\t\tattributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) {\n\n\t\t\treturn new Promise( function ( resolve ) {\n\n\t\t\t\tdracoLoader.decodeDracoFile( bufferView, function ( geometry ) {\n\n\t\t\t\t\tfor ( const attributeName in geometry.attributes ) {\n\n\t\t\t\t\t\tconst attribute = geometry.attributes[ attributeName ];\n\t\t\t\t\t\tconst normalized = attributeNormalizedMap[ attributeName ];\n\n\t\t\t\t\t\tif ( normalized !== undefined ) attribute.normalized = normalized;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve( geometry );\n\n\t\t\t\t}, threeAttributeMap, attributeTypeMap );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Texture Transform Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform\n */\nclass GLTFTextureTransformExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM;\n\n\t}\n\n\textendTexture( texture, transform ) {\n\n\t\tif ( ( transform.texCoord === undefined || transform.texCoord === texture.channel )\n\t\t\t&& transform.offset === undefined\n\t\t\t&& transform.rotation === undefined\n\t\t\t&& transform.scale === undefined ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21819.\n\t\t\treturn texture;\n\n\t\t}\n\n\t\ttexture = texture.clone();\n\n\t\tif ( transform.texCoord !== undefined ) {\n\n\t\t\ttexture.channel = transform.texCoord;\n\n\t\t}\n\n\t\tif ( transform.offset !== undefined ) {\n\n\t\t\ttexture.offset.fromArray( transform.offset );\n\n\t\t}\n\n\t\tif ( transform.rotation !== undefined ) {\n\n\t\t\ttexture.rotation = transform.rotation;\n\n\t\t}\n\n\t\tif ( transform.scale !== undefined ) {\n\n\t\t\ttexture.repeat.fromArray( transform.scale );\n\n\t\t}\n\n\t\ttexture.needsUpdate = true;\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Mesh Quantization Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization\n */\nclass GLTFMeshQuantizationExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MESH_QUANTIZATION;\n\n\t}\n\n}\n\n/*********************************/\n/********** INTERPOLATION ********/\n/*********************************/\n\n// Spline Interpolation\n// Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation\nclass GLTFCubicSplineInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tcopySampleValue_( index ) {\n\n\t\t// Copies a sample value to the result buffer. See description of glTF\n\t\t// CUBICSPLINE values layout in interpolate_() function below.\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tvalueSize = this.valueSize,\n\t\t\toffset = index * valueSize * 3 + valueSize;\n\n\t\tfor ( let i = 0; i !== valueSize; i ++ ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer;\n\t\tconst values = this.sampleValues;\n\t\tconst stride = this.valueSize;\n\n\t\tconst stride2 = stride * 2;\n\t\tconst stride3 = stride * 3;\n\n\t\tconst td = t1 - t0;\n\n\t\tconst p = ( t - t0 ) / td;\n\t\tconst pp = p * p;\n\t\tconst ppp = pp * p;\n\n\t\tconst offset1 = i1 * stride3;\n\t\tconst offset0 = offset1 - stride3;\n\n\t\tconst s2 = - 2 * ppp + 3 * pp;\n\t\tconst s3 = ppp - pp;\n\t\tconst s0 = 1 - s2;\n\t\tconst s1 = s3 - pp + p;\n\n\t\t// Layout of keyframe output values for CUBICSPLINE animations:\n\t\t// [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ]\n\t\tfor ( let i = 0; i !== stride; i ++ ) {\n\n\t\t\tconst p0 = values[ offset0 + i + stride ]; // splineVertex_k\n\t\t\tconst m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k)\n\t\t\tconst p1 = values[ offset1 + i + stride ]; // splineVertex_k+1\n\t\t\tconst m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k)\n\n\t\t\tresult[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\nconst _q = new Quaternion();\n\nclass GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant {\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = super.interpolate_( i1, t0, t, t1 );\n\n\t\t_q.fromArray( result ).normalize().toArray( result );\n\n\t\treturn result;\n\n\t}\n\n}\n\n\n/*********************************/\n/********** INTERNALS ************/\n/*********************************/\n\n/* CONSTANTS */\n\nconst WEBGL_CONSTANTS = {\n\tFLOAT: 5126,\n\t//FLOAT_MAT2: 35674,\n\tFLOAT_MAT3: 35675,\n\tFLOAT_MAT4: 35676,\n\tFLOAT_VEC2: 35664,\n\tFLOAT_VEC3: 35665,\n\tFLOAT_VEC4: 35666,\n\tLINEAR: 9729,\n\tREPEAT: 10497,\n\tSAMPLER_2D: 35678,\n\tPOINTS: 0,\n\tLINES: 1,\n\tLINE_LOOP: 2,\n\tLINE_STRIP: 3,\n\tTRIANGLES: 4,\n\tTRIANGLE_STRIP: 5,\n\tTRIANGLE_FAN: 6,\n\tUNSIGNED_BYTE: 5121,\n\tUNSIGNED_SHORT: 5123\n};\n\nconst WEBGL_COMPONENT_TYPES = {\n\t5120: Int8Array,\n\t5121: Uint8Array,\n\t5122: Int16Array,\n\t5123: Uint16Array,\n\t5125: Uint32Array,\n\t5126: Float32Array\n};\n\nconst WEBGL_FILTERS = {\n\t9728: NearestFilter,\n\t9729: LinearFilter,\n\t9984: NearestMipmapNearestFilter,\n\t9985: LinearMipmapNearestFilter,\n\t9986: NearestMipmapLinearFilter,\n\t9987: LinearMipmapLinearFilter\n};\n\nconst WEBGL_WRAPPINGS = {\n\t33071: ClampToEdgeWrapping,\n\t33648: MirroredRepeatWrapping,\n\t10497: RepeatWrapping\n};\n\nconst WEBGL_TYPE_SIZES = {\n\t'SCALAR': 1,\n\t'VEC2': 2,\n\t'VEC3': 3,\n\t'VEC4': 4,\n\t'MAT2': 4,\n\t'MAT3': 9,\n\t'MAT4': 16\n};\n\nconst ATTRIBUTES = {\n\tPOSITION: 'position',\n\tNORMAL: 'normal',\n\tTANGENT: 'tangent',\n\tTEXCOORD_0: 'uv',\n\tTEXCOORD_1: 'uv1',\n\tTEXCOORD_2: 'uv2',\n\tTEXCOORD_3: 'uv3',\n\tCOLOR_0: 'color',\n\tWEIGHTS_0: 'skinWeight',\n\tJOINTS_0: 'skinIndex',\n};\n\nconst PATH_PROPERTIES = {\n\tscale: 'scale',\n\ttranslation: 'position',\n\trotation: 'quaternion',\n\tweights: 'morphTargetInfluences'\n};\n\nconst INTERPOLATION = {\n\tCUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n\t\t // keyframe track will be initialized with a default interpolation type, then modified.\n\tLINEAR: InterpolateLinear,\n\tSTEP: InterpolateDiscrete\n};\n\nconst ALPHA_MODES = {\n\tOPAQUE: 'OPAQUE',\n\tMASK: 'MASK',\n\tBLEND: 'BLEND'\n};\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material\n */\nfunction createDefaultMaterial( cache ) {\n\n\tif ( cache[ 'DefaultMaterial' ] === undefined ) {\n\n\t\tcache[ 'DefaultMaterial' ] = new MeshStandardMaterial( {\n\t\t\tcolor: 0xFFFFFF,\n\t\t\temissive: 0x000000,\n\t\t\tmetalness: 1,\n\t\t\troughness: 1,\n\t\t\ttransparent: false,\n\t\t\tdepthTest: true,\n\t\t\tside: FrontSide\n\t\t} );\n\n\t}\n\n\treturn cache[ 'DefaultMaterial' ];\n\n}\n\nfunction addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) {\n\n\t// Add unknown glTF extensions to an object's userData.\n\n\tfor ( const name in objectDef.extensions ) {\n\n\t\tif ( knownExtensions[ name ] === undefined ) {\n\n\t\t\tobject.userData.gltfExtensions = object.userData.gltfExtensions || {};\n\t\t\tobject.userData.gltfExtensions[ name ] = objectDef.extensions[ name ];\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {Object3D|Material|BufferGeometry} object\n * @param {GLTF.definition} gltfDef\n */\nfunction assignExtrasToUserData( object, gltfDef ) {\n\n\tif ( gltfDef.extras !== undefined ) {\n\n\t\tif ( typeof gltfDef.extras === 'object' ) {\n\n\t\t\tObject.assign( object.userData, gltfDef.extras );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets\n *\n * @param {BufferGeometry} geometry\n * @param {Array<GLTF.Target>} targets\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\nfunction addMorphTargets( geometry, targets, parser ) {\n\n\tlet hasMorphPosition = false;\n\tlet hasMorphNormal = false;\n\tlet hasMorphColor = false;\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( target.POSITION !== undefined ) hasMorphPosition = true;\n\t\tif ( target.NORMAL !== undefined ) hasMorphNormal = true;\n\t\tif ( target.COLOR_0 !== undefined ) hasMorphColor = true;\n\n\t\tif ( hasMorphPosition && hasMorphNormal && hasMorphColor ) break;\n\n\t}\n\n\tif ( ! hasMorphPosition && ! hasMorphNormal && ! hasMorphColor ) return Promise.resolve( geometry );\n\n\tconst pendingPositionAccessors = [];\n\tconst pendingNormalAccessors = [];\n\tconst pendingColorAccessors = [];\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( hasMorphPosition ) {\n\n\t\t\tconst pendingAccessor = target.POSITION !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.POSITION )\n\t\t\t\t: geometry.attributes.position;\n\n\t\t\tpendingPositionAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphNormal ) {\n\n\t\t\tconst pendingAccessor = target.NORMAL !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.NORMAL )\n\t\t\t\t: geometry.attributes.normal;\n\n\t\t\tpendingNormalAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphColor ) {\n\n\t\t\tconst pendingAccessor = target.COLOR_0 !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.COLOR_0 )\n\t\t\t\t: geometry.attributes.color;\n\n\t\t\tpendingColorAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t}\n\n\treturn Promise.all( [\n\t\tPromise.all( pendingPositionAccessors ),\n\t\tPromise.all( pendingNormalAccessors ),\n\t\tPromise.all( pendingColorAccessors )\n\t] ).then( function ( accessors ) {\n\n\t\tconst morphPositions = accessors[ 0 ];\n\t\tconst morphNormals = accessors[ 1 ];\n\t\tconst morphColors = accessors[ 2 ];\n\n\t\tif ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions;\n\t\tif ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals;\n\t\tif ( hasMorphColor ) geometry.morphAttributes.color = morphColors;\n\t\tgeometry.morphTargetsRelative = true;\n\n\t\treturn geometry;\n\n\t} );\n\n}\n\n/**\n * @param {Mesh} mesh\n * @param {GLTF.Mesh} meshDef\n */\nfunction updateMorphTargets( mesh, meshDef ) {\n\n\tmesh.updateMorphTargets();\n\n\tif ( meshDef.weights !== undefined ) {\n\n\t\tfor ( let i = 0, il = meshDef.weights.length; i < il; i ++ ) {\n\n\t\t\tmesh.morphTargetInfluences[ i ] = meshDef.weights[ i ];\n\n\t\t}\n\n\t}\n\n\t// .extras has user-defined data, so check that .extras.targetNames is an array.\n\tif ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) {\n\n\t\tconst targetNames = meshDef.extras.targetNames;\n\n\t\tif ( mesh.morphTargetInfluences.length === targetNames.length ) {\n\n\t\t\tmesh.morphTargetDictionary = {};\n\n\t\t\tfor ( let i = 0, il = targetNames.length; i < il; i ++ ) {\n\n\t\t\t\tmesh.morphTargetDictionary[ targetNames[ i ] ] = i;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' );\n\n\t\t}\n\n\t}\n\n}\n\nfunction createPrimitiveKey( primitiveDef ) {\n\n\tlet geometryKey;\n\n\tconst dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ];\n\n\tif ( dracoExtension ) {\n\n\t\tgeometryKey = 'draco:' + dracoExtension.bufferView\n\t\t\t\t+ ':' + dracoExtension.indices\n\t\t\t\t+ ':' + createAttributesKey( dracoExtension.attributes );\n\n\t} else {\n\n\t\tgeometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode;\n\n\t}\n\n\tif ( primitiveDef.targets !== undefined ) {\n\n\t\tfor ( let i = 0, il = primitiveDef.targets.length; i < il; i ++ ) {\n\n\t\t\tgeometryKey += ':' + createAttributesKey( primitiveDef.targets[ i ] );\n\n\t\t}\n\n\t}\n\n\treturn geometryKey;\n\n}\n\nfunction createAttributesKey( attributes ) {\n\n\tlet attributesKey = '';\n\n\tconst keys = Object.keys( attributes ).sort();\n\n\tfor ( let i = 0, il = keys.length; i < il; i ++ ) {\n\n\t\tattributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';';\n\n\t}\n\n\treturn attributesKey;\n\n}\n\nfunction getNormalizedComponentScale( constructor ) {\n\n\t// Reference:\n\t// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization#encoding-quantized-data\n\n\tswitch ( constructor ) {\n\n\t\tcase Int8Array:\n\t\t\treturn 1 / 127;\n\n\t\tcase Uint8Array:\n\t\t\treturn 1 / 255;\n\n\t\tcase Int16Array:\n\t\t\treturn 1 / 32767;\n\n\t\tcase Uint16Array:\n\t\t\treturn 1 / 65535;\n\n\t\tdefault:\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported normalized accessor component type.' );\n\n\t}\n\n}\n\nfunction getImageURIMimeType( uri ) {\n\n\tif ( uri.search( /\\.jpe?g($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/jpeg/ ) === 0 ) return 'image/jpeg';\n\tif ( uri.search( /\\.webp($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/webp/ ) === 0 ) return 'image/webp';\n\n\treturn 'image/png';\n\n}\n\nconst _identityMatrix = new Matrix4();\n\n/* GLTF PARSER */\n\nclass GLTFParser {\n\n\tconstructor( json = {}, options = {} ) {\n\n\t\tthis.json = json;\n\t\tthis.extensions = {};\n\t\tthis.plugins = {};\n\t\tthis.options = options;\n\n\t\t// loader object cache\n\t\tthis.cache = new GLTFRegistry();\n\n\t\t// associations between Three.js objects and glTF elements\n\t\tthis.associations = new Map();\n\n\t\t// BufferGeometry caching\n\t\tthis.primitiveCache = {};\n\n\t\t// Node cache\n\t\tthis.nodeCache = {};\n\n\t\t// Object3D instance caches\n\t\tthis.meshCache = { refs: {}, uses: {} };\n\t\tthis.cameraCache = { refs: {}, uses: {} };\n\t\tthis.lightCache = { refs: {}, uses: {} };\n\n\t\tthis.sourceCache = {};\n\t\tthis.textureCache = {};\n\n\t\t// Track node names, to ensure no duplicates\n\t\tthis.nodeNamesUsed = {};\n\n\t\t// Use an ImageBitmapLoader if imageBitmaps are supported. Moves much of the\n\t\t// expensive work of uploading a texture to the GPU off the main thread.\n\n\t\tlet isSafari = false;\n\t\tlet isFirefox = false;\n\t\tlet firefoxVersion = - 1;\n\n\t\tif ( typeof navigator !== 'undefined' ) {\n\n\t\t\tisSafari = /^((?!chrome|android).)*safari/i.test( navigator.userAgent ) === true;\n\t\t\tisFirefox = navigator.userAgent.indexOf( 'Firefox' ) > - 1;\n\t\t\tfirefoxVersion = isFirefox ? navigator.userAgent.match( /Firefox\\/([0-9]+)\\./ )[ 1 ] : - 1;\n\n\t\t}\n\n\t\tif ( typeof createImageBitmap === 'undefined' || isSafari || ( isFirefox && firefoxVersion < 98 ) ) {\n\n\t\t\tthis.textureLoader = new TextureLoader( this.options.manager );\n\n\t\t} else {\n\n\t\t\tthis.textureLoader = new ImageBitmapLoader( this.options.manager );\n\n\t\t}\n\n\t\tthis.textureLoader.setCrossOrigin( this.options.crossOrigin );\n\t\tthis.textureLoader.setRequestHeader( this.options.requestHeader );\n\n\t\tthis.fileLoader = new FileLoader( this.options.manager );\n\t\tthis.fileLoader.setResponseType( 'arraybuffer' );\n\n\t\tif ( this.options.crossOrigin === 'use-credentials' ) {\n\n\t\t\tthis.fileLoader.setWithCredentials( true );\n\n\t\t}\n\n\t}\n\n\tsetExtensions( extensions ) {\n\n\t\tthis.extensions = extensions;\n\n\t}\n\n\tsetPlugins( plugins ) {\n\n\t\tthis.plugins = plugins;\n\n\t}\n\n\tparse( onLoad, onError ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\t// Clear the loader cache\n\t\tthis.cache.removeAll();\n\t\tthis.nodeCache = {};\n\n\t\t// Mark the special nodes/meshes in json for efficient parse\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\treturn ext._markDefs && ext._markDefs();\n\n\t\t} );\n\n\t\tPromise.all( this._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.beforeRoot && ext.beforeRoot();\n\n\t\t} ) ).then( function () {\n\n\t\t\treturn Promise.all( [\n\n\t\t\t\tparser.getDependencies( 'scene' ),\n\t\t\t\tparser.getDependencies( 'animation' ),\n\t\t\t\tparser.getDependencies( 'camera' ),\n\n\t\t\t] );\n\n\t\t} ).then( function ( dependencies ) {\n\n\t\t\tconst result = {\n\t\t\t\tscene: dependencies[ 0 ][ json.scene || 0 ],\n\t\t\t\tscenes: dependencies[ 0 ],\n\t\t\t\tanimations: dependencies[ 1 ],\n\t\t\t\tcameras: dependencies[ 2 ],\n\t\t\t\tasset: json.asset,\n\t\t\t\tparser: parser,\n\t\t\t\tuserData: {}\n\t\t\t};\n\n\t\t\taddUnknownExtensionsToUserData( extensions, result, json );\n\n\t\t\tassignExtrasToUserData( result, json );\n\n\t\t\treturn Promise.all( parser._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.afterRoot && ext.afterRoot( result );\n\n\t\t\t} ) ).then( function () {\n\n\t\t\t\tonLoad( result );\n\n\t\t\t} );\n\n\t\t} ).catch( onError );\n\n\t}\n\n\t/**\n\t * Marks the special nodes/meshes in json for efficient parse.\n\t */\n\t_markDefs() {\n\n\t\tconst nodeDefs = this.json.nodes || [];\n\t\tconst skinDefs = this.json.skins || [];\n\t\tconst meshDefs = this.json.meshes || [];\n\n\t\t// Nothing in the node definition indicates whether it is a Bone or an\n\t\t// Object3D. Use the skins' joint references to mark bones.\n\t\tfor ( let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) {\n\n\t\t\tconst joints = skinDefs[ skinIndex ].joints;\n\n\t\t\tfor ( let i = 0, il = joints.length; i < il; i ++ ) {\n\n\t\t\t\tnodeDefs[ joints[ i ] ].isBone = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Iterate over all nodes, marking references to shared resources,\n\t\t// as well as skeleton joints.\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.mesh !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.meshCache, nodeDef.mesh );\n\n\t\t\t\t// Nothing in the mesh definition indicates whether it is\n\t\t\t\t// a SkinnedMesh or Mesh. Use the node's mesh reference\n\t\t\t\t// to mark SkinnedMesh if node has skin.\n\t\t\t\tif ( nodeDef.skin !== undefined ) {\n\n\t\t\t\t\tmeshDefs[ nodeDef.mesh ].isSkinnedMesh = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.cameraCache, nodeDef.camera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Counts references to shared node / Object3D resources. These resources\n\t * can be reused, or \"instantiated\", at multiple nodes in the scene\n\t * hierarchy. Mesh, Camera, and Light instances are instantiated and must\n\t * be marked. Non-scenegraph resources (like Materials, Geometries, and\n\t * Textures) can be reused directly and are not marked here.\n\t *\n\t * Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n\t */\n\t_addNodeRef( cache, index ) {\n\n\t\tif ( index === undefined ) return;\n\n\t\tif ( cache.refs[ index ] === undefined ) {\n\n\t\t\tcache.refs[ index ] = cache.uses[ index ] = 0;\n\n\t\t}\n\n\t\tcache.refs[ index ] ++;\n\n\t}\n\n\t/** Returns a reference to a shared resource, cloning it if necessary. */\n\t_getNodeRef( cache, index, object ) {\n\n\t\tif ( cache.refs[ index ] <= 1 ) return object;\n\n\t\tconst ref = object.clone();\n\n\t\t// Propagates mappings to the cloned object, prevents mappings on the\n\t\t// original object from being lost.\n\t\tconst updateMappings = ( original, clone ) => {\n\n\t\t\tconst mappings = this.associations.get( original );\n\t\t\tif ( mappings != null ) {\n\n\t\t\t\tthis.associations.set( clone, mappings );\n\n\t\t\t}\n\n\t\t\tfor ( const [ i, child ] of original.children.entries() ) {\n\n\t\t\t\tupdateMappings( child, clone.children[ i ] );\n\n\t\t\t}\n\n\t\t};\n\n\t\tupdateMappings( object, ref );\n\n\t\tref.name += '_instance_' + ( cache.uses[ index ] ++ );\n\n\t\treturn ref;\n\n\t}\n\n\t_invokeOne( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.push( this );\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) return result;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t_invokeAll( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.unshift( this );\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) pending.push( result );\n\n\t\t}\n\n\t\treturn pending;\n\n\t}\n\n\t/**\n\t * Requests the specified dependency asynchronously, with caching.\n\t * @param {string} type\n\t * @param {number} index\n\t * @return {Promise<Object3D|Material|THREE.Texture|AnimationClip|ArrayBuffer|Object>}\n\t */\n\tgetDependency( type, index ) {\n\n\t\tconst cacheKey = type + ':' + index;\n\t\tlet dependency = this.cache.get( cacheKey );\n\n\t\tif ( ! dependency ) {\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'scene':\n\t\t\t\t\tdependency = this.loadScene( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'node':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadNode && ext.loadNode( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'mesh':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMesh && ext.loadMesh( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'accessor':\n\t\t\t\t\tdependency = this.loadAccessor( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bufferView':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadBufferView && ext.loadBufferView( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'buffer':\n\t\t\t\t\tdependency = this.loadBuffer( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'material':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMaterial && ext.loadMaterial( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'texture':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadTexture && ext.loadTexture( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'skin':\n\t\t\t\t\tdependency = this.loadSkin( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'animation':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadAnimation && ext.loadAnimation( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'camera':\n\t\t\t\t\tdependency = this.loadCamera( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext != this && ext.getDependency && ext.getDependency( type, index );\n\n\t\t\t\t\t} );\n\n\t\t\t\t\tif ( ! dependency ) {\n\n\t\t\t\t\t\tthrow new Error( 'Unknown type: ' + type );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tthis.cache.add( cacheKey, dependency );\n\n\t\t}\n\n\t\treturn dependency;\n\n\t}\n\n\t/**\n\t * Requests all dependencies of the specified type asynchronously, with caching.\n\t * @param {string} type\n\t * @return {Promise<Array<Object>>}\n\t */\n\tgetDependencies( type ) {\n\n\t\tlet dependencies = this.cache.get( type );\n\n\t\tif ( ! dependencies ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || [];\n\n\t\t\tdependencies = Promise.all( defs.map( function ( def, index ) {\n\n\t\t\t\treturn parser.getDependency( type, index );\n\n\t\t\t} ) );\n\n\t\t\tthis.cache.add( type, dependencies );\n\n\t\t}\n\n\t\treturn dependencies;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferIndex\n\t * @return {Promise<ArrayBuffer>}\n\t */\n\tloadBuffer( bufferIndex ) {\n\n\t\tconst bufferDef = this.json.buffers[ bufferIndex ];\n\t\tconst loader = this.fileLoader;\n\n\t\tif ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' );\n\n\t\t}\n\n\t\t// If present, GLB container is required to be the first buffer.\n\t\tif ( bufferDef.uri === undefined && bufferIndex === 0 ) {\n\n\t\t\treturn Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body );\n\n\t\t}\n\n\t\tconst options = this.options;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tloader.load( LoaderUtils.resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () {\n\n\t\t\t\treject( new Error( 'THREE.GLTFLoader: Failed to load buffer \"' + bufferDef.uri + '\".' ) );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferViewIndex\n\t * @return {Promise<ArrayBuffer>}\n\t */\n\tloadBufferView( bufferViewIndex ) {\n\n\t\tconst bufferViewDef = this.json.bufferViews[ bufferViewIndex ];\n\n\t\treturn this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) {\n\n\t\t\tconst byteLength = bufferViewDef.byteLength || 0;\n\t\t\tconst byteOffset = bufferViewDef.byteOffset || 0;\n\t\t\treturn buffer.slice( byteOffset, byteOffset + byteLength );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n\t * @param {number} accessorIndex\n\t * @return {Promise<BufferAttribute|InterleavedBufferAttribute>}\n\t */\n\tloadAccessor( accessorIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst accessorDef = this.json.accessors[ accessorIndex ];\n\n\t\tif ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) {\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\t\t\tconst normalized = accessorDef.normalized === true;\n\n\t\t\tconst array = new TypedArray( accessorDef.count * itemSize );\n\t\t\treturn Promise.resolve( new BufferAttribute( array, itemSize, normalized ) );\n\n\t\t}\n\n\t\tconst pendingBufferViews = [];\n\n\t\tif ( accessorDef.bufferView !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) );\n\n\t\t} else {\n\n\t\t\tpendingBufferViews.push( null );\n\n\t\t}\n\n\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) );\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) );\n\n\t\t}\n\n\t\treturn Promise.all( pendingBufferViews ).then( function ( bufferViews ) {\n\n\t\t\tconst bufferView = bufferViews[ 0 ];\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t// For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.\n\t\t\tconst elementBytes = TypedArray.BYTES_PER_ELEMENT;\n\t\t\tconst itemBytes = elementBytes * itemSize;\n\t\t\tconst byteOffset = accessorDef.byteOffset || 0;\n\t\t\tconst byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined;\n\t\t\tconst normalized = accessorDef.normalized === true;\n\t\t\tlet array, bufferAttribute;\n\n\t\t\t// The buffer is not interleaved if the stride is the item size in bytes.\n\t\t\tif ( byteStride && byteStride !== itemBytes ) {\n\n\t\t\t\t// Each \"slice\" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own InterleavedBuffer\n\t\t\t\t// This makes sure that IBA.count reflects accessor.count properly\n\t\t\t\tconst ibSlice = Math.floor( byteOffset / byteStride );\n\t\t\t\tconst ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count;\n\t\t\t\tlet ib = parser.cache.get( ibCacheKey );\n\n\t\t\t\tif ( ! ib ) {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes );\n\n\t\t\t\t\t// Integer parameters to IB/IBA are in array elements, not bytes.\n\t\t\t\t\tib = new InterleavedBuffer( array, byteStride / elementBytes );\n\n\t\t\t\t\tparser.cache.add( ibCacheKey, ib );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( ib, itemSize, ( byteOffset % byteStride ) / elementBytes, normalized );\n\n\t\t\t} else {\n\n\t\t\t\tif ( bufferView === null ) {\n\n\t\t\t\t\tarray = new TypedArray( accessorDef.count * itemSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t\t\t}\n\n\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors\n\t\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\t\tconst itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR;\n\t\t\t\tconst TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ];\n\n\t\t\t\tconst byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0;\n\t\t\t\tconst byteOffsetValues = accessorDef.sparse.values.byteOffset || 0;\n\n\t\t\t\tconst sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices );\n\t\t\t\tconst sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize );\n\n\t\t\t\tif ( bufferView !== null ) {\n\n\t\t\t\t\t// Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes.\n\t\t\t\t\tbufferAttribute = new BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, il = sparseIndices.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst index = sparseIndices[ i ];\n\n\t\t\t\t\tbufferAttribute.setX( index, sparseValues[ i * itemSize ] );\n\t\t\t\t\tif ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] );\n\t\t\t\t\tif ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] );\n\t\t\t\t\tif ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] );\n\t\t\t\t\tif ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn bufferAttribute;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n\t * @param {number} textureIndex\n\t * @return {Promise<THREE.Texture|null>}\n\t */\n\tloadTexture( textureIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceIndex = textureDef.source;\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tlet loader = this.textureLoader;\n\n\t\tif ( sourceDef.uri ) {\n\n\t\t\tconst handler = options.manager.getHandler( sourceDef.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.loadTextureImage( textureIndex, sourceIndex, loader );\n\n\t}\n\n\tloadTextureImage( textureIndex, sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst cacheKey = ( sourceDef.uri || sourceDef.bufferView ) + ':' + textureDef.sampler;\n\n\t\tif ( this.textureCache[ cacheKey ] ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21559.\n\t\t\treturn this.textureCache[ cacheKey ];\n\n\t\t}\n\n\t\tconst promise = this.loadImageSource( sourceIndex, loader ).then( function ( texture ) {\n\n\t\t\ttexture.flipY = false;\n\n\t\t\ttexture.name = textureDef.name || sourceDef.name || '';\n\n\t\t\tif ( texture.name === '' && typeof sourceDef.uri === 'string' && sourceDef.uri.startsWith( 'data:image/' ) === false ) {\n\n\t\t\t\ttexture.name = sourceDef.uri;\n\n\t\t\t}\n\n\t\t\tconst samplers = json.samplers || {};\n\t\t\tconst sampler = samplers[ textureDef.sampler ] || {};\n\n\t\t\ttexture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || LinearFilter;\n\t\t\ttexture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || LinearMipmapLinearFilter;\n\t\t\ttexture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || RepeatWrapping;\n\t\t\ttexture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || RepeatWrapping;\n\n\t\t\tparser.associations.set( texture, { textures: textureIndex } );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function () {\n\n\t\t\treturn null;\n\n\t\t} );\n\n\t\tthis.textureCache[ cacheKey ] = promise;\n\n\t\treturn promise;\n\n\t}\n\n\tloadImageSource( sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\n\t\tif ( this.sourceCache[ sourceIndex ] !== undefined ) {\n\n\t\t\treturn this.sourceCache[ sourceIndex ].then( ( texture ) => texture.clone() );\n\n\t\t}\n\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst URL = self.URL || self.webkitURL;\n\n\t\tlet sourceURI = sourceDef.uri || '';\n\t\tlet isObjectURL = false;\n\n\t\tif ( sourceDef.bufferView !== undefined ) {\n\n\t\t\t// Load binary image data from bufferView, if provided.\n\n\t\t\tsourceURI = parser.getDependency( 'bufferView', sourceDef.bufferView ).then( function ( bufferView ) {\n\n\t\t\t\tisObjectURL = true;\n\t\t\t\tconst blob = new Blob( [ bufferView ], { type: sourceDef.mimeType } );\n\t\t\t\tsourceURI = URL.createObjectURL( blob );\n\t\t\t\treturn sourceURI;\n\n\t\t\t} );\n\n\t\t} else if ( sourceDef.uri === undefined ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Image ' + sourceIndex + ' is missing URI and bufferView' );\n\n\t\t}\n\n\t\tconst promise = Promise.resolve( sourceURI ).then( function ( sourceURI ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tlet onLoad = resolve;\n\n\t\t\t\tif ( loader.isImageBitmapLoader === true ) {\n\n\t\t\t\t\tonLoad = function ( imageBitmap ) {\n\n\t\t\t\t\t\tconst texture = new Texture( imageBitmap );\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tresolve( texture );\n\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tloader.load( LoaderUtils.resolveURL( sourceURI, options.path ), onLoad, undefined, reject );\n\n\t\t\t} );\n\n\t\t} ).then( function ( texture ) {\n\n\t\t\t// Clean up resources and configure Texture.\n\n\t\t\tif ( isObjectURL === true ) {\n\n\t\t\t\tURL.revokeObjectURL( sourceURI );\n\n\t\t\t}\n\n\t\t\ttexture.userData.mimeType = sourceDef.mimeType || getImageURIMimeType( sourceDef.uri );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function ( error ) {\n\n\t\t\tconsole.error( 'THREE.GLTFLoader: Couldn\\'t load texture', sourceURI );\n\t\t\tthrow error;\n\n\t\t} );\n\n\t\tthis.sourceCache[ sourceIndex ] = promise;\n\t\treturn promise;\n\n\t}\n\n\t/**\n\t * Asynchronously assigns a texture to the given material parameters.\n\t * @param {Object} materialParams\n\t * @param {string} mapName\n\t * @param {Object} mapDef\n\t * @return {Promise<Texture>}\n\t */\n\tassignTexture( materialParams, mapName, mapDef, colorSpace ) {\n\n\t\tconst parser = this;\n\n\t\treturn this.getDependency( 'texture', mapDef.index ).then( function ( texture ) {\n\n\t\t\tif ( ! texture ) return null;\n\n\t\t\tif ( mapDef.texCoord !== undefined && mapDef.texCoord > 0 ) {\n\n\t\t\t\ttexture = texture.clone();\n\t\t\t\ttexture.channel = mapDef.texCoord;\n\n\t\t\t}\n\n\t\t\tif ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) {\n\n\t\t\t\tconst transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined;\n\n\t\t\t\tif ( transform ) {\n\n\t\t\t\t\tconst gltfReference = parser.associations.get( texture );\n\t\t\t\t\ttexture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform );\n\t\t\t\t\tparser.associations.set( texture, gltfReference );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( colorSpace !== undefined ) {\n\n\t\t\t\ttexture.colorSpace = colorSpace;\n\n\t\t\t}\n\n\t\t\tmaterialParams[ mapName ] = texture;\n\n\t\t\treturn texture;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Assigns final material to a Mesh, Line, or Points instance. The instance\n\t * already has a material (generated from the glTF material options alone)\n\t * but reuse of the same glTF material may require multiple threejs materials\n\t * to accommodate different primitive types, defines, etc. New materials will\n\t * be created if necessary, and reused from a cache.\n\t * @param {Object3D} mesh Mesh, Line, or Points instance.\n\t */\n\tassignFinalMaterial( mesh ) {\n\n\t\tconst geometry = mesh.geometry;\n\t\tlet material = mesh.material;\n\n\t\tconst useDerivativeTangents = geometry.attributes.tangent === undefined;\n\t\tconst useVertexColors = geometry.attributes.color !== undefined;\n\t\tconst useFlatShading = geometry.attributes.normal === undefined;\n\n\t\tif ( mesh.isPoints ) {\n\n\t\t\tconst cacheKey = 'PointsMaterial:' + material.uuid;\n\n\t\t\tlet pointsMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! pointsMaterial ) {\n\n\t\t\t\tpointsMaterial = new PointsMaterial();\n\t\t\t\tMaterial.prototype.copy.call( pointsMaterial, material );\n\t\t\t\tpointsMaterial.color.copy( material.color );\n\t\t\t\tpointsMaterial.map = material.map;\n\t\t\t\tpointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px\n\n\t\t\t\tthis.cache.add( cacheKey, pointsMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = pointsMaterial;\n\n\t\t} else if ( mesh.isLine ) {\n\n\t\t\tconst cacheKey = 'LineBasicMaterial:' + material.uuid;\n\n\t\t\tlet lineMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! lineMaterial ) {\n\n\t\t\t\tlineMaterial = new LineBasicMaterial();\n\t\t\t\tMaterial.prototype.copy.call( lineMaterial, material );\n\t\t\t\tlineMaterial.color.copy( material.color );\n\t\t\t\tlineMaterial.map = material.map;\n\n\t\t\t\tthis.cache.add( cacheKey, lineMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = lineMaterial;\n\n\t\t}\n\n\t\t// Clone the material if it will be modified\n\t\tif ( useDerivativeTangents || useVertexColors || useFlatShading ) {\n\n\t\t\tlet cacheKey = 'ClonedMaterial:' + material.uuid + ':';\n\n\t\t\tif ( useDerivativeTangents ) cacheKey += 'derivative-tangents:';\n\t\t\tif ( useVertexColors ) cacheKey += 'vertex-colors:';\n\t\t\tif ( useFlatShading ) cacheKey += 'flat-shading:';\n\n\t\t\tlet cachedMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! cachedMaterial ) {\n\n\t\t\t\tcachedMaterial = material.clone();\n\n\t\t\t\tif ( useVertexColors ) cachedMaterial.vertexColors = true;\n\t\t\t\tif ( useFlatShading ) cachedMaterial.flatShading = true;\n\n\t\t\t\tif ( useDerivativeTangents ) {\n\n\t\t\t\t\t// https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\t\t\t\tif ( cachedMaterial.normalScale ) cachedMaterial.normalScale.y *= - 1;\n\t\t\t\t\tif ( cachedMaterial.clearcoatNormalScale ) cachedMaterial.clearcoatNormalScale.y *= - 1;\n\n\t\t\t\t}\n\n\t\t\t\tthis.cache.add( cacheKey, cachedMaterial );\n\n\t\t\t\tthis.associations.set( cachedMaterial, this.associations.get( material ) );\n\n\t\t\t}\n\n\t\t\tmaterial = cachedMaterial;\n\n\t\t}\n\n\t\tmesh.material = material;\n\n\t}\n\n\tgetMaterialType( /* materialIndex */ ) {\n\n\t\treturn MeshStandardMaterial;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n\t * @param {number} materialIndex\n\t * @return {Promise<Material>}\n\t */\n\tloadMaterial( materialIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst materialDef = json.materials[ materialIndex ];\n\n\t\tlet materialType;\n\t\tconst materialParams = {};\n\t\tconst materialExtensions = materialDef.extensions || {};\n\n\t\tconst pending = [];\n\n\t\tif ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) {\n\n\t\t\tconst kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ];\n\t\t\tmaterialType = kmuExtension.getMaterialType();\n\t\t\tpending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t} else {\n\n\t\t\t// Specification:\n\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material\n\n\t\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness || {};\n\n\t\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\t\tmaterialParams.opacity = 1.0;\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) );\n\n\t\t\t}\n\n\t\t\tmaterialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0;\n\t\t\tmaterialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0;\n\n\t\t\tif ( metallicRoughness.metallicRoughnessTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\n\t\t\t}\n\n\t\t\tmaterialType = this._invokeOne( function ( ext ) {\n\n\t\t\t\treturn ext.getMaterialType && ext.getMaterialType( materialIndex );\n\n\t\t\t} );\n\n\t\t\tpending.push( Promise.all( this._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams );\n\n\t\t\t} ) ) );\n\n\t\t}\n\n\t\tif ( materialDef.doubleSided === true ) {\n\n\t\t\tmaterialParams.side = DoubleSide;\n\n\t\t}\n\n\t\tconst alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE;\n\n\t\tif ( alphaMode === ALPHA_MODES.BLEND ) {\n\n\t\t\tmaterialParams.transparent = true;\n\n\t\t\t// See: https://github.com/mrdoob/three.js/issues/17706\n\t\t\tmaterialParams.depthWrite = false;\n\n\t\t} else {\n\n\t\t\tmaterialParams.transparent = false;\n\n\t\t\tif ( alphaMode === ALPHA_MODES.MASK ) {\n\n\t\t\t\tmaterialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.normalTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) );\n\n\t\t\tmaterialParams.normalScale = new Vector2( 1, 1 );\n\n\t\t\tif ( materialDef.normalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = materialDef.normalTexture.scale;\n\n\t\t\t\tmaterialParams.normalScale.set( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.occlusionTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) );\n\n\t\t\tif ( materialDef.occlusionTexture.strength !== undefined ) {\n\n\t\t\t\tmaterialParams.aoMapIntensity = materialDef.occlusionTexture.strength;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.emissiveFactor !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tconst emissiveFactor = materialDef.emissiveFactor;\n\t\t\tmaterialParams.emissive = new Color().setRGB( emissiveFactor[ 0 ], emissiveFactor[ 1 ], emissiveFactor[ 2 ], LinearSRGBColorSpace );\n\n\t\t}\n\n\t\tif ( materialDef.emissiveTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\tconst material = new materialType( materialParams );\n\n\t\t\tif ( materialDef.name ) material.name = materialDef.name;\n\n\t\t\tassignExtrasToUserData( material, materialDef );\n\n\t\t\tparser.associations.set( material, { materials: materialIndex } );\n\n\t\t\tif ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef );\n\n\t\t\treturn material;\n\n\t\t} );\n\n\t}\n\n\t/** When Object3D instances are targeted by animation, they need unique names. */\n\tcreateUniqueName( originalName ) {\n\n\t\tconst sanitizedName = PropertyBinding.sanitizeNodeName( originalName || '' );\n\n\t\tif ( sanitizedName in this.nodeNamesUsed ) {\n\n\t\t\treturn sanitizedName + '_' + ( ++ this.nodeNamesUsed[ sanitizedName ] );\n\n\t\t} else {\n\n\t\t\tthis.nodeNamesUsed[ sanitizedName ] = 0;\n\n\t\t\treturn sanitizedName;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n\t *\n\t * Creates BufferGeometries from primitives.\n\t *\n\t * @param {Array<GLTF.Primitive>} primitives\n\t * @return {Promise<Array<BufferGeometry>>}\n\t */\n\tloadGeometries( primitives ) {\n\n\t\tconst parser = this;\n\t\tconst extensions = this.extensions;\n\t\tconst cache = this.primitiveCache;\n\n\t\tfunction createDracoPrimitive( primitive ) {\n\n\t\t\treturn extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]\n\t\t\t\t.decodePrimitive( primitive, parser )\n\t\t\t\t.then( function ( geometry ) {\n\n\t\t\t\t\treturn addPrimitiveAttributes( geometry, primitive, parser );\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst primitive = primitives[ i ];\n\t\t\tconst cacheKey = createPrimitiveKey( primitive );\n\n\t\t\t// See if we've already created this geometry\n\t\t\tconst cached = cache[ cacheKey ];\n\n\t\t\tif ( cached ) {\n\n\t\t\t\t// Use the cached geometry if it exists\n\t\t\t\tpending.push( cached.promise );\n\n\t\t\t} else {\n\n\t\t\t\tlet geometryPromise;\n\n\t\t\t\tif ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) {\n\n\t\t\t\t\t// Use DRACO geometry if available\n\t\t\t\t\tgeometryPromise = createDracoPrimitive( primitive );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise create a new geometry\n\t\t\t\t\tgeometryPromise = addPrimitiveAttributes( new BufferGeometry(), primitive, parser );\n\n\t\t\t\t}\n\n\t\t\t\t// Cache this geometry\n\t\t\t\tcache[ cacheKey ] = { primitive: primitive, promise: geometryPromise };\n\n\t\t\t\tpending.push( geometryPromise );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n\t * @param {number} meshIndex\n\t * @return {Promise<Group|Mesh|SkinnedMesh>}\n\t */\n\tloadMesh( meshIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\tconst meshDef = json.meshes[ meshIndex ];\n\t\tconst primitives = meshDef.primitives;\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst material = primitives[ i ].material === undefined\n\t\t\t\t? createDefaultMaterial( this.cache )\n\t\t\t\t: this.getDependency( 'material', primitives[ i ].material );\n\n\t\t\tpending.push( material );\n\n\t\t}\n\n\t\tpending.push( parser.loadGeometries( primitives ) );\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst materials = results.slice( 0, results.length - 1 );\n\t\t\tconst geometries = results[ results.length - 1 ];\n\n\t\t\tconst meshes = [];\n\n\t\t\tfor ( let i = 0, il = geometries.length; i < il; i ++ ) {\n\n\t\t\t\tconst geometry = geometries[ i ];\n\t\t\t\tconst primitive = primitives[ i ];\n\n\t\t\t\t// 1. create Mesh\n\n\t\t\t\tlet mesh;\n\n\t\t\t\tconst material = materials[ i ];\n\n\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ||\n\t\t\t\t\t\tprimitive.mode === undefined ) {\n\n\t\t\t\t\t// .isSkinnedMesh isn't in glTF spec. See ._markDefs()\n\t\t\t\t\tmesh = meshDef.isSkinnedMesh === true\n\t\t\t\t\t\t? new SkinnedMesh( geometry, material )\n\t\t\t\t\t\t: new Mesh( geometry, material );\n\n\t\t\t\t\tif ( mesh.isSkinnedMesh === true ) {\n\n\t\t\t\t\t\t// normalize skin weights to fix malformed assets (see #15319)\n\t\t\t\t\t\tmesh.normalizeSkinWeights();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleStripDrawMode );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleFanDrawMode );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) {\n\n\t\t\t\t\tmesh = new LineSegments( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) {\n\n\t\t\t\t\tmesh = new Line( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) {\n\n\t\t\t\t\tmesh = new LineLoop( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) {\n\n\t\t\t\t\tmesh = new Points( geometry, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode );\n\n\t\t\t\t}\n\n\t\t\t\tif ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) {\n\n\t\t\t\t\tupdateMorphTargets( mesh, meshDef );\n\n\t\t\t\t}\n\n\t\t\t\tmesh.name = parser.createUniqueName( meshDef.name || ( 'mesh_' + meshIndex ) );\n\n\t\t\t\tassignExtrasToUserData( mesh, meshDef );\n\n\t\t\t\tif ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive );\n\n\t\t\t\tparser.assignFinalMaterial( mesh );\n\n\t\t\t\tmeshes.push( mesh );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tparser.associations.set( meshes[ i ], {\n\t\t\t\t\tmeshes: meshIndex,\n\t\t\t\t\tprimitives: i\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( meshes.length === 1 ) {\n\n\t\t\t\tif ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, meshes[ 0 ], meshDef );\n\n\t\t\t\treturn meshes[ 0 ];\n\n\t\t\t}\n\n\t\t\tconst group = new Group();\n\n\t\t\tif ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, group, meshDef );\n\n\t\t\tparser.associations.set( group, { meshes: meshIndex } );\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tgroup.add( meshes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n\t * @param {number} cameraIndex\n\t * @return {Promise<THREE.Camera>}\n\t */\n\tloadCamera( cameraIndex ) {\n\n\t\tlet camera;\n\t\tconst cameraDef = this.json.cameras[ cameraIndex ];\n\t\tconst params = cameraDef[ cameraDef.type ];\n\n\t\tif ( ! params ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing camera parameters.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( cameraDef.type === 'perspective' ) {\n\n\t\t\tcamera = new PerspectiveCamera( MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 );\n\n\t\t} else if ( cameraDef.type === 'orthographic' ) {\n\n\t\t\tcamera = new OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar );\n\n\t\t}\n\n\t\tif ( cameraDef.name ) camera.name = this.createUniqueName( cameraDef.name );\n\n\t\tassignExtrasToUserData( camera, cameraDef );\n\n\t\treturn Promise.resolve( camera );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n\t * @param {number} skinIndex\n\t * @return {Promise<Skeleton>}\n\t */\n\tloadSkin( skinIndex ) {\n\n\t\tconst skinDef = this.json.skins[ skinIndex ];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = skinDef.joints.length; i < il; i ++ ) {\n\n\t\t\tpending.push( this._loadNodeShallow( skinDef.joints[ i ] ) );\n\n\t\t}\n\n\t\tif ( skinDef.inverseBindMatrices !== undefined ) {\n\n\t\t\tpending.push( this.getDependency( 'accessor', skinDef.inverseBindMatrices ) );\n\n\t\t} else {\n\n\t\t\tpending.push( null );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst inverseBindMatrices = results.pop();\n\t\t\tconst jointNodes = results;\n\n\t\t\t// Note that bones (joint nodes) may or may not be in the\n\t\t\t// scene graph at this time.\n\n\t\t\tconst bones = [];\n\t\t\tconst boneInverses = [];\n\n\t\t\tfor ( let i = 0, il = jointNodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst jointNode = jointNodes[ i ];\n\n\t\t\t\tif ( jointNode ) {\n\n\t\t\t\t\tbones.push( jointNode );\n\n\t\t\t\t\tconst mat = new Matrix4();\n\n\t\t\t\t\tif ( inverseBindMatrices !== null ) {\n\n\t\t\t\t\t\tmat.fromArray( inverseBindMatrices.array, i * 16 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tboneInverses.push( mat );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Joint \"%s\" could not be found.', skinDef.joints[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new Skeleton( bones, boneInverses );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n\t * @param {number} animationIndex\n\t * @return {Promise<AnimationClip>}\n\t */\n\tloadAnimation( animationIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\n\t\tconst animationDef = json.animations[ animationIndex ];\n\t\tconst animationName = animationDef.name ? animationDef.name : 'animation_' + animationIndex;\n\n\t\tconst pendingNodes = [];\n\t\tconst pendingInputAccessors = [];\n\t\tconst pendingOutputAccessors = [];\n\t\tconst pendingSamplers = [];\n\t\tconst pendingTargets = [];\n\n\t\tfor ( let i = 0, il = animationDef.channels.length; i < il; i ++ ) {\n\n\t\t\tconst channel = animationDef.channels[ i ];\n\t\t\tconst sampler = animationDef.samplers[ channel.sampler ];\n\t\t\tconst target = channel.target;\n\t\t\tconst name = target.node;\n\t\t\tconst input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input;\n\t\t\tconst output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output;\n\n\t\t\tif ( target.node === undefined ) continue;\n\n\t\t\tpendingNodes.push( this.getDependency( 'node', name ) );\n\t\t\tpendingInputAccessors.push( this.getDependency( 'accessor', input ) );\n\t\t\tpendingOutputAccessors.push( this.getDependency( 'accessor', output ) );\n\t\t\tpendingSamplers.push( sampler );\n\t\t\tpendingTargets.push( target );\n\n\t\t}\n\n\t\treturn Promise.all( [\n\n\t\t\tPromise.all( pendingNodes ),\n\t\t\tPromise.all( pendingInputAccessors ),\n\t\t\tPromise.all( pendingOutputAccessors ),\n\t\t\tPromise.all( pendingSamplers ),\n\t\t\tPromise.all( pendingTargets )\n\n\t\t] ).then( function ( dependencies ) {\n\n\t\t\tconst nodes = dependencies[ 0 ];\n\t\t\tconst inputAccessors = dependencies[ 1 ];\n\t\t\tconst outputAccessors = dependencies[ 2 ];\n\t\t\tconst samplers = dependencies[ 3 ];\n\t\t\tconst targets = dependencies[ 4 ];\n\n\t\t\tconst tracks = [];\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst node = nodes[ i ];\n\t\t\t\tconst inputAccessor = inputAccessors[ i ];\n\t\t\t\tconst outputAccessor = outputAccessors[ i ];\n\t\t\t\tconst sampler = samplers[ i ];\n\t\t\t\tconst target = targets[ i ];\n\n\t\t\t\tif ( node === undefined ) continue;\n\n\t\t\t\tif ( node.updateMatrix ) {\n\n\t\t\t\t\tnode.updateMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tconst createdTracks = parser._createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target );\n\n\t\t\t\tif ( createdTracks ) {\n\n\t\t\t\t\tfor ( let k = 0; k < createdTracks.length; k ++ ) {\n\n\t\t\t\t\t\ttracks.push( createdTracks[ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( animationName, undefined, tracks );\n\n\t\t} );\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( nodeDef.mesh === undefined ) return null;\n\n\t\treturn parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) {\n\n\t\t\tconst node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh );\n\n\t\t\t// if weights are provided on the node, override weights on the mesh.\n\t\t\tif ( nodeDef.weights !== undefined ) {\n\n\t\t\t\tnode.traverse( function ( o ) {\n\n\t\t\t\t\tif ( ! o.isMesh ) return;\n\n\t\t\t\t\tfor ( let i = 0, il = nodeDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\t\t\to.morphTargetInfluences[ i ] = nodeDef.weights[ i ];\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n\t * @param {number} nodeIndex\n\t * @return {Promise<Object3D>}\n\t */\n\tloadNode( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tconst nodePending = parser._loadNodeShallow( nodeIndex );\n\n\t\tconst childPending = [];\n\t\tconst childrenDef = nodeDef.children || [];\n\n\t\tfor ( let i = 0, il = childrenDef.length; i < il; i ++ ) {\n\n\t\t\tchildPending.push( parser.getDependency( 'node', childrenDef[ i ] ) );\n\n\t\t}\n\n\t\tconst skeletonPending = nodeDef.skin === undefined\n\t\t\t? Promise.resolve( null )\n\t\t\t: parser.getDependency( 'skin', nodeDef.skin );\n\n\t\treturn Promise.all( [\n\t\t\tnodePending,\n\t\t\tPromise.all( childPending ),\n\t\t\tskeletonPending\n\t\t] ).then( function ( results ) {\n\n\t\t\tconst node = results[ 0 ];\n\t\t\tconst children = results[ 1 ];\n\t\t\tconst skeleton = results[ 2 ];\n\n\t\t\tif ( skeleton !== null ) {\n\n\t\t\t\t// This full traverse should be fine because\n\t\t\t\t// child glTF nodes have not been added to this node yet.\n\t\t\t\tnode.traverse( function ( mesh ) {\n\n\t\t\t\t\tif ( ! mesh.isSkinnedMesh ) return;\n\n\t\t\t\t\tmesh.bind( skeleton, _identityMatrix );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = children.length; i < il; i ++ ) {\n\n\t\t\t\tnode.add( children[ i ] );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t// ._loadNodeShallow() parses a single node.\n\t// skin and child nodes are created and added in .loadNode() (no '_' prefix).\n\t_loadNodeShallow( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst parser = this;\n\n\t\t// This method is called from .loadNode() and .loadSkin().\n\t\t// Cache a node to avoid duplication.\n\n\t\tif ( this.nodeCache[ nodeIndex ] !== undefined ) {\n\n\t\t\treturn this.nodeCache[ nodeIndex ];\n\n\t\t}\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\t// reserve node's name before its dependencies, so the root has the intended name.\n\t\tconst nodeName = nodeDef.name ? parser.createUniqueName( nodeDef.name ) : '';\n\n\t\tconst pending = [];\n\n\t\tconst meshPromise = parser._invokeOne( function ( ext ) {\n\n\t\t\treturn ext.createNodeMesh && ext.createNodeMesh( nodeIndex );\n\n\t\t} );\n\n\t\tif ( meshPromise ) {\n\n\t\t\tpending.push( meshPromise );\n\n\t\t}\n\n\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\tpending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) {\n\n\t\t\t\treturn parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera );\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tparser._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.createNodeAttachment && ext.createNodeAttachment( nodeIndex );\n\n\t\t} ).forEach( function ( promise ) {\n\n\t\t\tpending.push( promise );\n\n\t\t} );\n\n\t\tthis.nodeCache[ nodeIndex ] = Promise.all( pending ).then( function ( objects ) {\n\n\t\t\tlet node;\n\n\t\t\t// .isBone isn't in glTF spec. See ._markDefs\n\t\t\tif ( nodeDef.isBone === true ) {\n\n\t\t\t\tnode = new Bone();\n\n\t\t\t} else if ( objects.length > 1 ) {\n\n\t\t\t\tnode = new Group();\n\n\t\t\t} else if ( objects.length === 1 ) {\n\n\t\t\t\tnode = objects[ 0 ];\n\n\t\t\t} else {\n\n\t\t\t\tnode = new Object3D();\n\n\t\t\t}\n\n\t\t\tif ( node !== objects[ 0 ] ) {\n\n\t\t\t\tfor ( let i = 0, il = objects.length; i < il; i ++ ) {\n\n\t\t\t\t\tnode.add( objects[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.name ) {\n\n\t\t\t\tnode.userData.name = nodeDef.name;\n\t\t\t\tnode.name = nodeName;\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( node, nodeDef );\n\n\t\t\tif ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef );\n\n\t\t\tif ( nodeDef.matrix !== undefined ) {\n\n\t\t\t\tconst matrix = new Matrix4();\n\t\t\t\tmatrix.fromArray( nodeDef.matrix );\n\t\t\t\tnode.applyMatrix4( matrix );\n\n\t\t\t} else {\n\n\t\t\t\tif ( nodeDef.translation !== undefined ) {\n\n\t\t\t\t\tnode.position.fromArray( nodeDef.translation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.rotation !== undefined ) {\n\n\t\t\t\t\tnode.quaternion.fromArray( nodeDef.rotation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.scale !== undefined ) {\n\n\t\t\t\t\tnode.scale.fromArray( nodeDef.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! parser.associations.has( node ) ) {\n\n\t\t\t\tparser.associations.set( node, {} );\n\n\t\t\t}\n\n\t\t\tparser.associations.get( node ).nodes = nodeIndex;\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t\treturn this.nodeCache[ nodeIndex ];\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n\t * @param {number} sceneIndex\n\t * @return {Promise<Group>}\n\t */\n\tloadScene( sceneIndex ) {\n\n\t\tconst extensions = this.extensions;\n\t\tconst sceneDef = this.json.scenes[ sceneIndex ];\n\t\tconst parser = this;\n\n\t\t// Loader returns Group, not Scene.\n\t\t// See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172\n\t\tconst scene = new Group();\n\t\tif ( sceneDef.name ) scene.name = parser.createUniqueName( sceneDef.name );\n\n\t\tassignExtrasToUserData( scene, sceneDef );\n\n\t\tif ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef );\n\n\t\tconst nodeIds = sceneDef.nodes || [];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = nodeIds.length; i < il; i ++ ) {\n\n\t\t\tpending.push( parser.getDependency( 'node', nodeIds[ i ] ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( nodes ) {\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tscene.add( nodes[ i ] );\n\n\t\t\t}\n\n\t\t\t// Removes dangling associations, associations that reference a node that\n\t\t\t// didn't make it into the scene.\n\t\t\tconst reduceAssociations = ( node ) => {\n\n\t\t\t\tconst reducedAssociations = new Map();\n\n\t\t\t\tfor ( const [ key, value ] of parser.associations ) {\n\n\t\t\t\t\tif ( key instanceof Material || key instanceof Texture ) {\n\n\t\t\t\t\t\treducedAssociations.set( key, value );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tnode.traverse( ( node ) => {\n\n\t\t\t\t\tconst mappings = parser.associations.get( node );\n\n\t\t\t\t\tif ( mappings != null ) {\n\n\t\t\t\t\t\treducedAssociations.set( node, mappings );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn reducedAssociations;\n\n\t\t\t};\n\n\t\t\tparser.associations = reduceAssociations( scene );\n\n\t\t\treturn scene;\n\n\t\t} );\n\n\t}\n\n\t_createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target ) {\n\n\t\tconst tracks = [];\n\n\t\tconst targetName = node.name ? node.name : node.uuid;\n\t\tconst targetNames = [];\n\n\t\tif ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) {\n\n\t\t\tnode.traverse( function ( object ) {\n\n\t\t\t\tif ( object.morphTargetInfluences ) {\n\n\t\t\t\t\ttargetNames.push( object.name ? object.name : object.uuid );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\ttargetNames.push( targetName );\n\n\t\t}\n\n\t\tlet TypedKeyframeTrack;\n\n\t\tswitch ( PATH_PROPERTIES[ target.path ] ) {\n\n\t\t\tcase PATH_PROPERTIES.weights:\n\n\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tcase PATH_PROPERTIES.rotation:\n\n\t\t\t\tTypedKeyframeTrack = QuaternionKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tcase PATH_PROPERTIES.position:\n\t\t\tcase PATH_PROPERTIES.scale:\n\n\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tswitch ( outputAccessor.itemSize ) {\n\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\tcase 3:\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tconst interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : InterpolateLinear;\n\n\n\t\tconst outputArray = this._getArrayFromAccessor( outputAccessor );\n\n\t\tfor ( let j = 0, jl = targetNames.length; j < jl; j ++ ) {\n\n\t\t\tconst track = new TypedKeyframeTrack(\n\t\t\t\ttargetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ],\n\t\t\t\tinputAccessor.array,\n\t\t\t\toutputArray,\n\t\t\t\tinterpolation\n\t\t\t);\n\n\t\t\t// Override interpolation with custom factory method.\n\t\t\tif ( sampler.interpolation === 'CUBICSPLINE' ) {\n\n\t\t\t\tthis._createCubicSplineTrackInterpolant( track );\n\n\t\t\t}\n\n\t\t\ttracks.push( track );\n\n\t\t}\n\n\t\treturn tracks;\n\n\t}\n\n\t_getArrayFromAccessor( accessor ) {\n\n\t\tlet outputArray = accessor.array;\n\n\t\tif ( accessor.normalized ) {\n\n\t\t\tconst scale = getNormalizedComponentScale( outputArray.constructor );\n\t\t\tconst scaled = new Float32Array( outputArray.length );\n\n\t\t\tfor ( let j = 0, jl = outputArray.length; j < jl; j ++ ) {\n\n\t\t\t\tscaled[ j ] = outputArray[ j ] * scale;\n\n\t\t\t}\n\n\t\t\toutputArray = scaled;\n\n\t\t}\n\n\t\treturn outputArray;\n\n\t}\n\n\t_createCubicSplineTrackInterpolant( track ) {\n\n\t\ttrack.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) {\n\n\t\t\t// A CUBICSPLINE keyframe in glTF has three output values for each input value,\n\t\t\t// representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize()\n\t\t\t// must be divided by three to get the interpolant's sampleSize argument.\n\n\t\t\tconst interpolantType = ( this instanceof QuaternionKeyframeTrack ) ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;\n\n\t\t\treturn new interpolantType( this.times, this.values, this.getValueSize() / 3, result );\n\n\t\t};\n\n\t\t// Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants.\n\t\ttrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;\n\n\t}\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n */\nfunction computeBounds( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst box = new Box3();\n\n\tif ( attributes.POSITION !== undefined ) {\n\n\t\tconst accessor = parser.json.accessors[ attributes.POSITION ];\n\n\t\tconst min = accessor.min;\n\t\tconst max = accessor.max;\n\n\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\tbox.set(\n\t\t\t\tnew Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ),\n\t\t\t\tnew Vector3( max[ 0 ], max[ 1 ], max[ 2 ] )\n\t\t\t);\n\n\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\tbox.min.multiplyScalar( boxScale );\n\t\t\t\tbox.max.multiplyScalar( boxScale );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\treturn;\n\n\t\t}\n\n\t} else {\n\n\t\treturn;\n\n\t}\n\n\tconst targets = primitiveDef.targets;\n\n\tif ( targets !== undefined ) {\n\n\t\tconst maxDisplacement = new Vector3();\n\t\tconst vector = new Vector3();\n\n\t\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tconst target = targets[ i ];\n\n\t\t\tif ( target.POSITION !== undefined ) {\n\n\t\t\t\tconst accessor = parser.json.accessors[ target.POSITION ];\n\t\t\t\tconst min = accessor.min;\n\t\t\t\tconst max = accessor.max;\n\n\t\t\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\t\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\t\t\t// we need to get max of absolute components because target weight is [-1,1]\n\t\t\t\t\tvector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) );\n\t\t\t\t\tvector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) );\n\t\t\t\t\tvector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) );\n\n\n\t\t\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\t\t\tvector.multiplyScalar( boxScale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative\n\t\t\t\t\t// to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets\n\t\t\t\t\t// are used to implement key-frame animations and as such only two are active at a time - this results in very large\n\t\t\t\t\t// boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size.\n\t\t\t\t\tmaxDisplacement.max( vector );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets.\n\t\tbox.expandByVector( maxDisplacement );\n\n\t}\n\n\tgeometry.boundingBox = box;\n\n\tconst sphere = new Sphere();\n\n\tbox.getCenter( sphere.center );\n\tsphere.radius = box.min.distanceTo( box.max ) / 2;\n\n\tgeometry.boundingSphere = sphere;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\nfunction addPrimitiveAttributes( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst pending = [];\n\n\tfunction assignAttributeAccessor( accessorIndex, attributeName ) {\n\n\t\treturn parser.getDependency( 'accessor', accessorIndex )\n\t\t\t.then( function ( accessor ) {\n\n\t\t\t\tgeometry.setAttribute( attributeName, accessor );\n\n\t\t\t} );\n\n\t}\n\n\tfor ( const gltfAttributeName in attributes ) {\n\n\t\tconst threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase();\n\n\t\t// Skip attributes already provided by e.g. Draco extension.\n\t\tif ( threeAttributeName in geometry.attributes ) continue;\n\n\t\tpending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) );\n\n\t}\n\n\tif ( primitiveDef.indices !== undefined && ! geometry.index ) {\n\n\t\tconst accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) {\n\n\t\t\tgeometry.setIndex( accessor );\n\n\t\t} );\n\n\t\tpending.push( accessor );\n\n\t}\n\n\tif ( ColorManagement.workingColorSpace !== LinearSRGBColorSpace && 'COLOR_0' in attributes ) {\n\n\t\tconsole.warn( `THREE.GLTFLoader: Converting vertex colors from \"srgb-linear\" to \"${ColorManagement.workingColorSpace}\" not supported.` );\n\n\t}\n\n\tassignExtrasToUserData( geometry, primitiveDef );\n\n\tcomputeBounds( geometry, primitiveDef, parser );\n\n\treturn Promise.all( pending ).then( function () {\n\n\t\treturn primitiveDef.targets !== undefined\n\t\t\t? addMorphTargets( geometry, primitiveDef.targets, parser )\n\t\t\t: geometry;\n\n\t} );\n\n}\n\nexport { GLTFLoader };\n","import {DicePreset} from './DicePreset.js';\nimport {BASE_PRESETS_LIST, EXTRA_PRESETS_LIST} from './DiceDefaultPresets.js';\nimport {DiceColors, DICE_SCALE, COLORSETS} from './DiceColors.js';\nimport {DICE_MODELS} from './DiceModels.js';\nimport * as THREE from 'three';\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\nimport { ShaderUtils } from './ShaderUtils';\nexport class DiceFactory {\n\n\tconstructor() {\n\t\tthis.geometries = {};\n\n\t\tthis.baseScale = 50;\n\n\t\tthis.preferredSystem = \"standard\";\n\t\tthis.preferredColorset = \"custom\";\n\n\t\tthis.cache_hits = 0;\n\t\tthis.cache_misses = 0;\n\n\t\tthis.realisticLighting = true;\n\n\t\tthis.loaderGLTF = new GLTFLoader();\n\t\tthis.fontLoadingPromises = [];\n\n\t\tthis.baseTextureCache = {};\n\n\t\tthis.systems = {\n\t\t\t'standard': {id: 'standard', name: game.i18n.localize(\"DICESONICE.System.Standard\"), dice:[], mode:\"default\"},\n\t\t\t'spectrum': {id: 'spectrum', name: game.i18n.localize(\"DICESONICE.System.SpectrumDice\"), dice:[], mode:\"default\"},\n\t\t\t'foundry_vtt': {id: 'foundry_vtt', name: game.i18n.localize(\"DICESONICE.System.FoundryVTT\"), dice:[], mode:\"default\"},\n\t\t\t'dot': {id: 'dot', name: game.i18n.localize(\"DICESONICE.System.Dot\"), dice:[], mode:\"default\"},\n\t\t\t'dot_b': {id: 'dot_b', name: game.i18n.localize(\"DICESONICE.System.DotBlack\"), dice:[], mode:\"default\"}\n\t\t};\n\t\t\n\t\tBASE_PRESETS_LIST.forEach((preset) => {\n\t\t\tthis.register(preset);\n\t\t});\n\t\t\n\t\tEXTRA_PRESETS_LIST.forEach((data) => {\n\t\t\tthis.addDicePreset(data);\n\t\t});\n\n\t\tfor(let i in CONFIG.Dice.terms){\n\t\t\tlet term = CONFIG.Dice.terms[i];\n\t\t\t//If this is not a core dice type\n\t\t\tif(![Coin, FateDie, Die].includes(term)){\n\t\t\t\tlet objTerm = new term({});\n\t\t\t\tif([2, 3, 4, 6, 8, 10, 12, 14, 16, 20, 24, 30].includes(objTerm.faces)){\n\t\t\t\t\tthis.internalAddDicePreset(objTerm);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tinitializeMaterials(){\n\t\tif(this.realisticLighting){\n\t\t\tthis.material_options = {\n\t\t\t\t'plastic': {\n\t\t\t\t\t'type':\"standard\",\n\t\t\t\t\t'options':{\n\t\t\t\t\t\tmetalness: 0,\n\t\t\t\t\t\troughness: 0.6,\n\t\t\t\t\t\tenvMapIntensity:1\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\troughnessMap : \"roughnessMap_fingerprint\",\n\t\t\t\t\t\tenvMap : true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'metal': {\n\t\t\t\t\t'type':'standard',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\troughness: 0.6,\n\t\t\t\t\t\tmetalness: 1\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\troughnessMap : \"roughnessMap_metal\",\n\t\t\t\t\t\tenvMap : true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'wood': {\n\t\t\t\t\t'type':'standard',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\troughness:1,\n\t\t\t\t\t\tmetalness:0\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\troughnessMap : \"roughnessMap_wood\",\n\t\t\t\t\t\tenvMap : true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'glass': {\n\t\t\t\t\t'type':'standard',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\troughness: 0.3,\n\t\t\t\t\t\tmetalness: 0\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\troughnessMap : \"roughnessMap_fingerprint\",\n\t\t\t\t\t\tenvMap : true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'chrome': {\n\t\t\t\t\t'type':'standard',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tmetalness: 1,\n\t\t\t\t\t\troughness: 0.1\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\troughnessMap : \"roughnessMap_fingerprint\",\n\t\t\t\t\t\tenvMap : true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'pristine': {\n\t\t\t\t\t'type':'physical',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tmetalness: 0,\n\t\t\t\t\t\troughness: 0.8,\n\t\t\t\t\t\tenvMapIntensity:1,\n\t\t\t\t\t\tclearcoat: 1,\n\t\t\t\t\t\tclearcoatRoughness: 0.9\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\tenvMap : true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'iridescent': {\n\t\t\t\t\t'type':'physical',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tmetalness: 1,\n\t\t\t\t\t\troughness: 0.2,\n\t\t\t\t\t\tiridescence: 1,\n\t\t\t\t\t\tiridescenceIOR: 1.8,\n\t\t\t\t\t\tiridescenceThicknessRange: [485,515]\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\tenvMap : true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'stone': {\n\t\t\t\t\t'type':'standard',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tmetalness: 0,\n\t\t\t\t\t\troughness: 1\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\troughnessMap : \"roughnessMap_stone\",\n\t\t\t\t\t\tenvMap : true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.material_options = {\n\t\t\t\t'plastic': {\n\t\t\t\t\t'type':\"phong\",\n\t\t\t\t\t'options':{\n\t\t\t\t\t\tspecular: 0xffffff,\n\t\t\t\t\t\tcolor: 0xb5b5b5,\n\t\t\t\t\t\tshininess: 3,\n\t\t\t\t\t\tflatShading: true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'metal': {\n\t\t\t\t\t'type':'standard',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tcolor: 0xdddddd,\n\t\t\t\t\t\temissive:0x111111,\n\t\t\t\t\t\troughness: 0.6,\n\t\t\t\t\t\tmetalness: 1,\n\t\t\t\t\t\tenvMapIntensity:2\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\tenvMap:true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'wood': {\n\t\t\t\t\t'type':'phong',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tspecular: 0xffffff,\n\t\t\t\t\t\tcolor: 0xb5b5b5,\n\t\t\t\t\t\tshininess: 1,\n\t\t\t\t\t\tflatShading: true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'glass': {\n\t\t\t\t\t'type':'phong',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tspecular: 0xffffff,\n\t\t\t\t\t\tcolor: 0xb5b5b5,\n\t\t\t\t\t\tshininess: 0.3,\n\t\t\t\t\t\treflectivity:0.1,\n\t\t\t\t\t\tcombine:THREE.MixOperation\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\tenvMap:true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'chrome': {\n\t\t\t\t\t'type':'phong',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tspecular: 0xffffff,\n\t\t\t\t\t\tcolor: 0xb5b5b5,\n\t\t\t\t\t\tshininess: 1,\n\t\t\t\t\t\treflectivity:0.7,\n\t\t\t\t\t\tcombine:THREE.AddOperation\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\tenvMap:true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t//no difference with plastic without advanced ligthing\n\t\t\t\t'pristine': {\n\t\t\t\t\t'type':'phong',\n\t\t\t\t\t'options':{\n\t\t\t\t\t\tspecular: 0xffffff,\n\t\t\t\t\t\tcolor: 0xb5b5b5,\n\t\t\t\t\t\tshininess: 3,\n\t\t\t\t\t\tflatShading: true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'iridescent': {\n\t\t\t\t\t'type':'standard',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tcolor: 0xdddddd,\n\t\t\t\t\t\temissive:0x111111,\n\t\t\t\t\t\troughness: 0.2,\n\t\t\t\t\t\tmetalness: 1,\n\t\t\t\t\t\tenvMapIntensity:2,\n\t\t\t\t\t\tuserData:{\n\t\t\t\t\t\t\tiridescent:true\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\tenvMap:true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'stone': {\n\t\t\t\t\t'type':'lambert',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tcolor: 0xb5b5b5,\n\t\t\t\t\t\treflectivity:0.01\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\tenvMap:true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tsetScale(scale){\n\t\tthis.baseScale = scale;\n\t}\n\n\tsetQualitySettings(config){\n\t\tthis.realisticLighting = config.bumpMapping;\n\t\tthis.aa = config.antialiasing;\n\t\tthis.glow = config.glow;\n\t\tthis.useHighDPI = config.useHighDPI;\n\t\tthis.shadows = config.shadowQuality != \"none\";\n\t\tthis.shadowQuality = config.shadowQuality;\n\t}\n\n\tregister(diceobj) {\n\t\t//If it is added to standard, it can be from automated system detecting DiceTerm, or the basic dice list. In those case, the internalAdd preorperty is set to true\n\t\t//Everything should exist in the standard system\n\t\t//We check to see if there's already this Dice DONOMINATOR in the standard system\n\t\tlet index = this.systems.standard.dice.findIndex(el => el.type == diceobj.type);\n\n\t\t//If it exists in the standard system, and it was added there by the automated system, we want to override and load it\n\t\tif(index>=0 && (this.systems.standard.dice[index].internalAdd || diceobj.internalAdd)){\n\t\t\tthis.systems.standard.dice[index] = diceobj;\n\t\t\tif(diceobj.modelFile){\n\t\t\t\tdiceobj.loadModel(this.loaderGLTF);\n\t\t\t} else {\n\t\t\t\tdiceobj.loadTextures();\n\t\t\t}\n\t\t}\n\t\tif(diceobj.system == \"standard\"){\n\t\t\t//If we're adding to the standard system directly, we only do it if it didn't exist previously\n\t\t\tif(index < 0){\n\t\t\t\tthis.systems[diceobj.system].dice.push(diceobj);\n\t\t\t}\t\n\t\t} else {\n\t\t\t//If for some reasons, we try to register a dice type that doesnt exist on the standard system, we add it there first.\n\t\t\t//This should not happen because of internalAddDicePreset but I'm only 95% sure.\n\t\t\tif(index<0){\n\t\t\t\tthis.systems.standard.dice.push(diceobj);\n\t\t\t\tif(diceobj.modelFile){\n\t\t\t\t\tdiceobj.loadModel(this.loaderGLTF);\n\t\t\t\t} else {\n\t\t\t\t\tdiceobj.loadTextures();\n\t\t\t\t}\n\t\t\t}\n\t\t\t//Then we add it to its own system. No need to load it, that will be taken care of automatically\n\t\t\tthis.systems[diceobj.system].dice.push(diceobj);\n\t\t}\n\t}\n\n\tasync preloadPresets(waitForLoad = true, userID = null, config = {}){\n\t\tlet activePresets = [];\n\t\tconst preloadPresetsByUser = (user) => {\n\t\t\tlet appearance = user.getFlag(\"dice-so-nice\", \"appearance\") ? foundry.utils.duplicate(user.getFlag(\"dice-so-nice\", \"appearance\")) : null;\n\t\t\tif(!appearance){\n\t\t\t\tappearance = {global:{}};\n\t\t\t\tif(this.preferredSystem != \"standard\")\n\t\t\t\t\tappearance.global.system = this.preferredSystem;\n\t\t\t\tif(this.preferredColorset != \"custom\")\n\t\t\t\t\tappearance.global.colorset = this.preferredColorset;\n\t\t\t}\n\t\t\t//load basic model\n\t\t\tthis.systems[\"standard\"].dice.forEach((obj) =>{\n\t\t\t\tactivePresets.push(obj);\n\t\t\t});\n\t\t\tfoundry.utils.mergeObject(appearance, config,{performDeletions:true});\n\t\t\tif(!foundry.utils.isEmpty(appearance)){\n\t\t\t\tfor (let scope in appearance) {\n\t\t\t\t\tif (appearance.hasOwnProperty(scope)) {\n\t\t\t\t\t\tif(scope != \"global\")\n\t\t\t\t\t\t\tactivePresets.push(this.getPresetBySystem(scope, appearance[scope].system));\n\t\t\t\t\t\telse if(this.systems.hasOwnProperty(appearance[scope].system)){\n\t\t\t\t\t\t\tthis.systems[appearance[scope].system].dice.forEach((obj) =>{\n\t\t\t\t\t\t\t\tactivePresets.push(obj);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tif(userID)\n\t\t\tpreloadPresetsByUser(game.users.get(userID));\n\t\telse\n \tgame.users.forEach((user) =>{\n\t\t\t\tpreloadPresetsByUser(user);\n\t\t\t});\n //remove duplicate\n activePresets = activePresets.filter((v, i, a) => a.indexOf(v) === i);\n\t\tlet promiseArray = [];\n\t\tactivePresets.forEach((preset)=>{\n\t\t\tif(preset){\n\t\t\t\tif(preset.modelFile){\n\t\t\t\t\t//Custom 3D model\n\t\t\t\t\tpromiseArray.push(preset.loadModel(this.loaderGLTF));\n\t\t\t\t} else {\n\t\t\t\t\t//Classic 3D model\n\t\t\t\t\tpromiseArray.push(preset.loadTextures());\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tif(waitForLoad)\n\t\t\tawait Promise.all(promiseArray);\n\t}\n\n\t//{id: 'standard', name: game.i18n.localize(\"DICESONICE.System.Standard\")}\n\taddSystem(system, mode=\"default\"){\n\t\tsystem.dice = [];\n\t\tsystem.mode = mode;\n\t\tif(mode != \"default\" && this.preferredSystem == \"standard\")\n\t\t\tthis.preferredSystem = system.id;\n\t\tthis.systems[system.id] = system;\n\t}\n\t//{type:\"\",labels:[],system:\"\"}\n\t//Should have been called \"addDicePresetFromModel\" but ¯\\_(ツ)_/¯\n\taddDicePreset(dice, shape = null){\n\t\tlet model = this.systems[\"standard\"].dice.find(el => el.type == dice.type);\n\t\tif(!model || !model.internalAdd){\n\t\t\tif(!shape)\n\t\t\t\tshape = dice.type;\n\t\t\tmodel = this.systems[\"standard\"].dice.find(el => el.type == shape);\n\t\t}\n\t\tlet preset = new DicePreset(dice.type, model.shape);\n\t\tlet denominator = dice.type.substr(1);\n\n\t\tpreset.term = isNaN(denominator) ? CONFIG.Dice.terms[denominator].name : \"Die\";\n\t\t\n\t\tpreset.setLabels(dice.labels);\n\t\tpreset.setModel(dice.modelFile);\n\t\tif(dice.values){\n\t\t\tif(dice.values.min == undefined)\n\t\t\t\tdice.values.min = 1;\n\t\t\tif(dice.values.max == undefined)\n\t\t\t\tdice.values.max = model.values.length;\n\t\t\tif(dice.values.step == undefined)\n\t\t\t\tdice.values.step = 1;\n\t\t\tpreset.setValues(dice.values.min,dice.values.max,dice.values.step);\n\t\t} else {\n\t\t\tpreset.values = model.values;\n\t\t\tpreset.valueMap = model.valueMap;\n\t\t}\n\t\tif(dice.valueMap){\n\t\t\tpreset.valueMap = dice.valueMap;\n\t\t}\n\t\tpreset.mass = model.mass;\n\t\tpreset.scale = model.scale;\n\t\tpreset.inertia = model.inertia;\n\t\tpreset.system = dice.system;\n\t\tpreset.font = dice.font;\n\t\tpreset.fontScale = dice.fontScale || null;\n\t\tpreset.colorset = dice.colorset || null;\n\t\t//If it overrides an existing model that isn't a numbered die, set a font scale to prevent undesired fontScale from previous model\n\t\tif(!preset.fontScale && ![\"d2\",\"d4\",\"d6\",\"d8\",\"d10\",\"d12\",\"d14\",\"d16\",\"d20\",\"d24\",\"d30\",\"d100\"].includes(dice.type) && this.systems[\"standard\"].dice.find(el => el.type == dice.type))\n\t\t\tpreset.fontScale = DICE_SCALE[shape];\n\t\t\n\t\tif(dice.bumpMaps && dice.bumpMaps.length)\n\t\t\tpreset.setBumpMaps(dice.bumpMaps);\n\n\t\tif(dice.emissiveMaps && dice.emissiveMaps.length)\n\t\t\tpreset.setEmissiveMaps(dice.emissiveMaps);\n\n\t\tif(dice.emissive)\n\t\t\tpreset.emissive = dice.emissive;\n\n\t\tif(dice.emissiveIntensity)\n\t\t\tpreset.emissiveIntensity = dice.emissiveIntensity;\n\n\t\tthis.register(preset);\n\n\t\tif(dice.font && !FontConfig.getAvailableFonts().includes(dice.font)){\n\t\t\tthis.fontLoadingPromises.push(FontConfig.loadFont(dice.font,{editor:false,fonts:[]}));\n\t\t}\n\t}\n\n\t//Is called when trying to create a DicePreset by guessing its faces from the CONFIG entries\n\tinternalAddDicePreset(diceobj){\n\t\tlet shape = \"d\";\n\t\tlet fakeShape = [3,5,7];\n\t\tif(fakeShape.includes(diceobj.faces))\n\t\t\tshape += (diceobj.faces*2);\n\t\telse\n\t\t\tshape += diceobj.faces;\n\t\tlet type = \"d\" + diceobj.constructor.DENOMINATION;\n\t\tlet model = this.systems[\"standard\"].dice.find(el => el.type == shape);\n\t\tlet preset = new DicePreset(type, model.shape);\n\t\tpreset.term = diceobj.constructor.name;\n\t\tlet labels = [];\n\t\tfor(let i = 1;i<= diceobj.faces;i++){\n\t\t\tlabels.push(diceobj.getResultLabel({result:i}));\n\t\t}\n\t\tpreset.setLabels(labels);\n\t\tpreset.setValues(1,diceobj.faces);\n\t\tpreset.mass = model.mass;\n\t\tpreset.inertia = model.inertia;\n\t\tpreset.scale = model.scale;\n\t\tpreset.internalAdd = true;\n\t\tthis.register(preset);\n\t}\n\n\tdisposeCachedMaterials(type = null){\n\t\tfor (const material in this.baseTextureCache) {\n\t\t\tif(type == null || material.substr(0,type.length) == type){\n\t\t\t\tthis.baseTextureCache[material].map.dispose();\n\t\t\t\tif(this.baseTextureCache[material].bumpMap)\n\t\t\t\t\tthis.baseTextureCache[material].bumpMap.dispose();\n\t\t\t\tif(this.baseTextureCache[material].emissiveMap)\n\t\t\t\t\tthis.baseTextureCache[material].emissiveMap.dispose();\n\t\t\t\tthis.baseTextureCache[material].dispose();\n\t\t\t\tdelete this.baseTextureCache[material];\n\t\t\t}\n\t\t}\n\t}\n\n\t//Stripped version from the Foundry Core library to avoid reloading fonts\n\tasync _loadFonts(){\n\t\tconst timeout = new Promise(resolve => setTimeout(resolve, 4500));\n\t\tconst ready = Promise.all(this.fontLoadingPromises).then(() => document.fonts.ready);\n\t\tthis.fontLoadingPromises = [];\n\t\tawait Promise.race([ready, timeout]);\n\t}\n\n\tget(type) {\n\t\treturn this.getPresetBySystem(type);\n\t}\n\n\tgetPresetBySystem(type, system = \"standard\"){\n\t\tlet model = this.systems[\"standard\"].dice.find(obj => obj.type == type);\n\t\tif(!model)\n\t\t\treturn null;\n\t\tlet diceobj = null;\n\t\tif(system != \"standard\"){\n\t\t\tif(this.systems.hasOwnProperty(system)){\n\t\t\t\tdiceobj = this.systems[system].dice.find(obj => obj.type == type && obj.shape == model.shape);\n\t\t\t\tif(!diceobj && !['Coin', 'FateDie', 'Die'].includes(model.term)){\n\t\t\t\t\t//If it doesn't exist and is not a core DiceTerm, we look for a similar shape and values\n\t\t\t\t\tdiceobj = this.systems[system].dice.find(obj => obj.shape == model.shape && obj.values.length == model.values.length && !model.colorset);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(!diceobj){\n\t\t\tdiceobj = this.systems.standard.dice.find(obj => obj.type == type);\n\t\t}\n\t\treturn diceobj;\n\t}\n\n\t// returns a dicemesh (THREE.Mesh) object\n\tcreate(scopedTextureCache, type, appearance) {\n\t\tlet diceobj = this.getPresetBySystem(type, appearance.system);\n\t\tif(diceobj.model && appearance.isGhost){\n\t\t\tdiceobj = this.getPresetBySystem(type, \"standard\");\n\t\t}\n\t\tlet scopedScale = scopedTextureCache.type == \"board\" ? this.baseScale : 60;\n\t\tif (!diceobj) return null;\n\t\tlet dicemesh;\n\n\t\tlet geom = this.geometries[type+scopedScale];\n\t\tif(!geom) {\n\t\t\tgeom = this.createGeometry(diceobj.shape, diceobj.scale, scopedScale);\n\t\t\tthis.geometries[type+scopedScale] = geom;\n\t\t}\n\t\tif (!geom) return null;\n\n\n\t\tif(diceobj.model){\n\t\t\tdicemesh = diceobj.model.scene.children[0].clone();\n\t\t\tlet scale = scopedScale/100;\n\t\t\tdicemesh.scale.set(scale,scale,scale);\n\t\t\tif(!dicemesh.geometry)\n\t\t\t\tdicemesh.geometry = {};\n\t\t\tdicemesh.geometry.cannon_shape = geom.cannon_shape;\n\t\t\tif(diceobj.model.animations.length>0){\n\t\t\t\tdicemesh.mixer = new THREE.AnimationMixer(dicemesh);\n\t\t\t\tdicemesh.mixer.clipAction(diceobj.model.animations[0]).play();\n\t\t\t}\n\t\t}else{\n\t\t\tlet materialData = this.generateMaterialData(diceobj, appearance);\n\n\t\t\tlet baseTextureCacheString = scopedTextureCache.type+type+materialData.cacheString;\n\t\t\tlet materials;\n\t\t\tif(this.baseTextureCache[baseTextureCacheString])\n\t\t\t\tmaterials = this.baseTextureCache[baseTextureCacheString];\n\t\t\telse\n\t\t\t\tmaterials = this.createMaterials(scopedTextureCache, baseTextureCacheString, diceobj, materialData);\n\t\t\t\n\t\t\tdicemesh = new THREE.Mesh(geom, materials);\n\n\t\t\t//TODO: Find if this entire block is still needed\n\t\t\t//I think not\n\t\t\tif (diceobj.color) {\n\t\t\t\tdicemesh.material[0].color = new THREE.Color(diceobj.color);\n\t\t\t\tif(this.realisticLighting)\n\t\t\t\t\tdicemesh.material[0].color.convertLinearToSRGB();\n\t\t\t\t//dicemesh.material[0].emissive = new THREE.Color(diceobj.color);\n\t\t\t\tdicemesh.material[0].emissiveIntensity = diceobj.emissiveIntensity ? diceobj.emissiveIntensity : 1;\n\t\t\t\tdicemesh.material[0].needsUpdate = true;\n\t\t\t}\n\t\t}\n\t\t\n\t\tdicemesh.result = [];\n\t\tdicemesh.shape = diceobj.shape;\n\t\tdicemesh.rerolls = 0;\n\t\tdicemesh.resultReason = 'natural';\n\n\t\tlet factory = this;\n\t\tdicemesh.getFaceValue = function() {\n\t\t\tlet reason = this.resultReason;\n\t\t\tlet vector = new THREE.Vector3(0, 0, this.shape == 'd4' ? -1 : 1);\n\t\t\tlet faceCannon = new THREE.Vector3();\n\t\t\tlet closest_face, closest_angle = Math.PI * 2;\n\t\t\tfor (let i = 0, l = this.body_sim.shapes[0].faceNormals.length; i < l; ++i) {\n\t\t\t\tif(DICE_MODELS[this.shape].faceValues[i] == 0)\n\t\t\t\t\tcontinue;\n\t\t\t\tfaceCannon.copy(this.body_sim.shapes[0].faceNormals[i]);\n\t\t\t\t\n\t\t\t\tlet angle = faceCannon.applyQuaternion(this.body_sim.quaternion).angleTo(vector);\n\t\t\t\tif (angle < closest_angle) {\n\t\t\t\t\tclosest_angle = angle;\n\t\t\t\t\tclosest_face = i;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst diceobj = factory.get(this.notation.type);\n\t\t\tlet dieValue = DICE_MODELS[this.shape].faceValues[closest_face];\n\n\t\t\tif (this.shape == 'd4') {\n\t\t\t\treturn {value: dieValue, label: diceobj.labels[dieValue-1], reason: reason};\n\t\t\t}\n\t\t\tlet labelIndex = dieValue;\n\t\t\tif (['d10','d2'].includes(this.shape)) labelIndex += 1;\n\t\t\tlet label = diceobj.labels[labelIndex+1];\n\n\t\t\t//console.log('Face Value', closest_face, dieValue, label)\n\n\t\t\treturn {value: dieValue, label: label, reason: reason};\n\t\t};\n\n\t\tdicemesh.storeRolledValue = function() {\n\t\t\tthis.result.push(this.getFaceValue());\n\t\t};\n\n\t\tdicemesh.getLastValue = function() {\n\t\t\tif (!this.result || this.result.length < 1) return {value: undefined, label: '', reason: ''};\n\n\t\t\treturn this.result[this.result.length-1];\n\t\t};\n\n\t\tdicemesh.setLastValue = function(result) {\n\t\t\tif (!this.result || this.result.length < 1) return;\n\t\t\tif (!result || result.length < 1) return;\n\n\t\t\treturn this.result[this.result.length-1] = result;\n\t\t};\n\n\t\treturn dicemesh;\n\t}\n\n\tcreateMaterials(scopedTextureCache, baseTextureCacheString, diceobj, materialData) {\n\t\tif(this.baseTextureCache[baseTextureCacheString])\n\t\t\treturn this.baseTextureCache[baseTextureCacheString];\n\n\t\tlet labels = diceobj.labels;\n\t\tif (diceobj.shape == 'd4') {\n\t\t\tlabels = diceobj.labels[0];\n\t\t}\n\t\t//If the texture is an array of texture (for random face texture), we look at the first element to determine the faces material and the edge texture\n\t\tlet dice_texture = Array.isArray(materialData.texture) ? materialData.texture[0] : materialData.texture;\n\n\t\tvar mat;\n\t\tlet materialSelected = this.material_options[materialData.material] ? this.material_options[materialData.material] : this.material_options[\"plastic\"];\n\t\tif(!this.realisticLighting){\n\t\t\tdelete materialSelected.roughnessMap;\n\t\t}\n\t\tswitch(materialSelected.type){\n\t\t\tcase \"phong\":\n\t\t\t\tmat = new THREE.MeshPhongMaterial(materialSelected.options);\n\t\t\t\tbreak;\n\t\t\tcase \"standard\":\n\t\t\t\tmat = new THREE.MeshStandardMaterial(materialSelected.options);\n\t\t\t\tbreak;\n\t\t\tcase \"lambert\":\n\t\t\t\tmat = new THREE.MeshLambertMaterial(materialSelected.options);\n\t\t\t\tbreak;\n\t\t\tcase \"physical\":\n\t\t\t\tmat = new THREE.MeshPhysicalMaterial(materialSelected.options);\n\t\t\t\tbreak;\n\t\t\tdefault: //plastic\n\t\t\t\tmat = new THREE.MeshPhongMaterial(this.material_options.plastic.options);\n\t\t}\n\t\tif(materialSelected.scopedOptions){\n\t\t\tif(materialSelected.scopedOptions.envMap)\n\t\t\t\tmat.envMap = scopedTextureCache.textureCube;\n\t\t\tif(materialSelected.scopedOptions.roughnessMap)\n\t\t\t\tmat.roughnessMap = scopedTextureCache[materialSelected.scopedOptions.roughnessMap];\n\t\t}\n\t\tlet font = {\n\t\t\t\"type\":diceobj.font,\n\t\t\t\"scale\": diceobj.fontScale ? diceobj.fontScale:null\n\t\t};\n\t\t\n\t\tif(!font.type){\n\t\t\tfont.type = materialData.font;\n\t\t}\n\t\tif(!font.scale){\n\t\t\tif(materialData.fontScale[diceobj.type])\n\t\t\t\tfont.scale = materialData.fontScale[diceobj.type];\n\t\t\telse{\n\t\t\t\tfont.scale = DICE_SCALE[diceobj.shape];\n\t\t\t}\t\n\t\t}\n\n\t\tlet canvas = document.createElement(\"canvas\");\n\t\tlet context = canvas.getContext(\"2d\", {alpha: true});\n\t\tcontext.globalAlpha = 0;\n\n\t\tlet canvasBump = document.createElement(\"canvas\");\n\t\tlet contextBump = canvasBump.getContext(\"2d\", {alpha: true});\n\t\tcontextBump.globalAlpha = 0;\n\n\t\tlet canvasEmissive = document.createElement(\"canvas\");\n\t\tlet contextEmissive = canvasEmissive.getContext(\"2d\");\n\t\t\n\t\tlet labelsTotal = labels.length;\n\t\tlet isHeritedFromShape = [\"d3\",\"d5\",\"d7\"].includes(diceobj.type) || (diceobj.type == \"df\"&&diceobj.shape == \"d6\");\n\t\tif(isHeritedFromShape){\n\t\t\tlabelsTotal = labelsTotal*2 -2;\n\t\t\tif(diceobj.shape == \"d2\" || diceobj.shape == \"d10\")\n\t\t\t\tlabelsTotal += 1;\n\t\t}\n\n\t\tlet texturesPerLine = Math.ceil(Math.sqrt(labelsTotal));\n\t\tlet sizeTexture = 256;\n\t\tlet ts = this.calc_texture_size(Math.sqrt(labelsTotal)*sizeTexture, true);\n\t\t\n\t\tcanvas.width = canvas.height = canvasBump.width = canvasBump.height = canvasEmissive.width = canvasEmissive.height = ts;\n\t\tlet x = 0;\n\t\tlet y = 0;\n\t\tlet texturesOnThisLine = 0;\n\t\tfor (var i = 0; i < labels.length; ++i) {\n\t\t\tif(texturesOnThisLine == texturesPerLine){\n\t\t\t\ty += sizeTexture;\n\t\t\t\tx = 0;\n\t\t\t\ttexturesOnThisLine = 0;\n\t\t\t}\n\t\t\tif(i==0)//edge\n\t\t\t{\n\t\t\t\t//if the texture is fully opaque, we do not use it for edge\n\t\t\t\tlet texture = {name:\"none\"};\n\t\t\t\tif(dice_texture.composite != \"source-over\")\n\t\t\t\t\ttexture = dice_texture;\n\t\t\t\tthis.createTextMaterial(context, contextBump, contextEmissive, x, y, sizeTexture, diceobj, labels, font, i, texture, materialData);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis.createTextMaterial(context, contextBump, contextEmissive, x, y, sizeTexture, diceobj, labels, font, i, materialData.texture, materialData);\n\t\t\t}\n\t\t\ttexturesOnThisLine++;\n\t\t\tx += sizeTexture;\n\t\t}\n\n\t\t//Special dice from shape divided by 2\n\t\t//D3\n\t\tif(isHeritedFromShape){\n\t\t\tlet startI = 2;\n\t\t\t//for some reason, there's an extra empty cell for all shape except d2 and d10. Should fix that at some point.\n\t\t\tif(diceobj.shape == \"d2\" || diceobj.shape == \"d10\")\n\t\t\t\tstartI = 1;\n\t\t\tfor(i=startI;i<labels.length;i++){\n\t\t\t\tif(texturesOnThisLine == texturesPerLine){\n\t\t\t\t\ty += sizeTexture;\n\t\t\t\t\tx = 0;\n\t\t\t\t\ttexturesOnThisLine = 0;\n\t\t\t\t}\n\t\t\t\tthis.createTextMaterial(context, contextBump, contextEmissive, x, y, sizeTexture, diceobj, labels, font, i, materialData.texture, materialData);\n\t\t\t\ttexturesOnThisLine++;\n\t\t\t\tx += sizeTexture;\n\t\t\t}\n\t\t}\n\n\n\t\t//var img = canvas.toDataURL(\"image/png\");\n\t\t//document.write('<img src=\"'+img+'\"/>');\n\t\t//generate basetexture for caching\n\t\tif(!this.baseTextureCache[baseTextureCacheString]){\n\t\t\tlet texture = new THREE.CanvasTexture(canvas);\n\t\t\tif(this.realisticLighting)\n\t\t\t\ttexture.colorSpace = THREE.SRGBColorSpace;\n\t\t\ttexture.flipY = false;\n\t\t\tmat.map = texture;\n\t\t\tmat.map.anisotropy = game.dice3d.box.anisotropy;\n\n\t\t\tif(this.realisticLighting){\n\t\t\t\tlet bumpMap = new THREE.CanvasTexture(canvasBump);\n\t\t\t\tbumpMap.flipY = false;\n\t\t\t\tmat.bumpMap = bumpMap;\n\n\t\t\t\tlet emissiveMap = new THREE.CanvasTexture(canvasEmissive);\n\t\t\t\tif(this.realisticLighting)\n\t\t\t\t\temissiveMap.colorSpace = THREE.SRGBColorSpace;\n\t\t\t\temissiveMap.flipY = false;\n\t\t\t\tmat.emissiveMap = emissiveMap;\n\t\t\t\tmat.emissiveIntensity = diceobj.emissiveIntensity ? diceobj.emissiveIntensity:1;\n\t\t\t\tmat.emissive = new THREE.Color(diceobj.emissive);\n\t\t\t\tif(this.realisticLighting)\n\t\t\t\t\tmat.emissive.convertLinearToSRGB();\n\t\t\t}\n\t\t}\n\n\t\t//mat.displacementMap = mat.bumpMap;\n\n\t\tswitch(materialData.material){\n\t\t\tcase \"chrome\":\n\t\t\t\tif(this.realisticLighting)\n\t\t\t\t\tmat.metalnessMap = mat.bumpMap;\n\t\t\t\tbreak;\n\t\t\tcase \"iridescent\":\n\t\t\t\tif(this.realisticLighting)\n\t\t\t\t\tmat.metalnessMap = mat.bumpMap;\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\tmat.opacity = 1;\n\t\tmat.transparent = true;\n\t\tmat.depthTest = true;\n\t\tmat.needUpdate = true;\n\n\t\tmat.onBeforeCompile = ShaderUtils.applyDiceSoNiceShader;\n\n\t\tthis.baseTextureCache[baseTextureCacheString] = mat;\n\t\treturn mat;\n\t}\n\tcreateTextMaterial(context, contextBump, contextEmissive, x, y, ts, diceobj, labels, font, index, texture, materialData) {\n\t\tif (labels[index] === undefined) return null;\n\n\t\tlet forecolor = materialData.foreground;\n\t\tlet outlinecolor = materialData.outline;\n\t\tlet backcolor = index > 0 ? materialData.background : materialData.edge != \"\" ? materialData.edge:materialData.background;\n\n\t\tif(Array.isArray(texture))\n\t\t\ttexture = texture[Math.floor(Math.random() * texture.length)];\n\t\t\n\t\tlet text = labels[index];\n\t\tlet bump = diceobj.bumps[index];\n\t\tlet emissive = diceobj.emissiveMaps[index];\n\t\tlet isTexture = false;\n\t\tlet margin = 1.0;\n\n\t\t// create color\n\t\tcontext.fillStyle = backcolor;\n\t\tcontext.fillRect(x, y, ts, ts);\n\n\t\tcontextBump.fillStyle = \"#FFFFFF\";\n\t\tcontextBump.fillRect(x, y, ts, ts);\n\n\t\tcontextEmissive.fillStyle = \"#000000\";\n\t\tcontextEmissive.fillRect(x, y, ts, ts);\n\n\t\t//context.rect(x, y, ts, ts);\n\t\t//context.stroke();\n\n\t\t//create underlying texture\n\t\tif (texture.name != '' && texture.name != 'none') {\n\t\t\tcontext.save();\n\t\t\tcontext.beginPath();\n\t\t\tcontext.rect(x,y,ts,ts);\n\t\t\tcontext.clip();\n\t\t\tcontext.globalCompositeOperation = texture.composite || 'source-over';\n\t\t\tcontext.drawImage(texture.texture, x, y, ts, ts);\n\t\t\tcontext.restore();\n\t\t\t\n\t\t\tif (texture.bump != '') {\n\t\t\t\tcontextBump.drawImage(texture.bump, x, y, ts, ts);\n\t\t\t}\n\t\t}\n\n\t\t// create text\n\t\tcontext.globalCompositeOperation = 'source-over';\n\t\tcontext.textAlign = \"center\";\n\t\tcontext.textBaseline = \"middle\";\n\n\t\tcontextBump.textAlign = \"center\";\n\t\tcontextBump.textBaseline = \"middle\";\n\t\tcontextBump.shadowColor = \"#000000\";\n\t\tcontextBump.shadowOffsetX = 1;\n\t\tcontextBump.shadowOffsetY = 1;\n\t\tcontextBump.shadowBlur = 3;\n\n\t\tcontextEmissive.textAlign = \"center\";\n\t\tcontextEmissive.textBaseline = \"middle\";\n\t\t\n\t\tif (diceobj.shape != 'd4') {\n\t\t\tif(materialData.isGhost && labels[index] != \"\")\n\t\t\t\ttext = \"?\";\n\t\t\t//custom texture face\n\t\t\tif(text instanceof HTMLImageElement){\n\t\t\t\tisTexture = true;\n\t\t\t\tcontext.drawImage(text, 0,0,text.width,text.height,x,y,ts,ts);\n\t\t\t\tif(bump)\n\t\t\t\t\tcontextBump.drawImage(bump, 0,0,text.width,text.height,x,y,ts,ts);\n\t\t\t\tif(emissive)\n\t\t\t\t\tcontextEmissive.drawImage(emissive, 0,0,text.width,text.height,x,y,ts,ts);\n\t\t\t}\n\t\t\telse{\n\t\t\t\tlet fontsize = ts / (1 + 2 * margin);\n\t\t\t\tlet textstarty = (ts / 2);\n\t\t\t\tlet textstartx = (ts / 2);\n\n\t\t\t\tif(font.scale)\n\t\t\t\t\tfontsize *= font.scale;\n\n\t\t\t\t//Needed for every fonts\n\t\t\t\tswitch(diceobj.shape){\n\t\t\t\t\tcase 'd10':\n\t\t\t\t\t\ttextstarty = textstartx*1.3;\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'd14':\n\t\t\t\t\t\ttextstarty = textstartx*1.4;\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'd16':\n\t\t\t\t\t\ttextstarty = textstartx*1.4;\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'd8':\n\t\t\t\t\t\ttextstarty = textstarty*1.1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'd12':\n\t\t\t\t\t\ttextstarty = textstarty*1.08;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'd20':\n\t\t\t\t\t\ttextstarty = textstartx*1.2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'd6':\n\t\t\t\t\t\ttextstarty = textstarty*1.1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcontext.font = fontsize+ 'pt '+font.type;\n\t\t\t\tcontextBump.font = fontsize+ 'pt '+font.type;\n\t\t\t\tcontextEmissive.font = fontsize+ 'pt '+font.type;\n\n\t\t\t\tvar lineHeight = fontsize;\n\t\t\t\t\n\t\t\t\tlet textlines = text.split(\"\\n\");\n\n\t\t\t\tif (textlines.length > 1) {\n\t\t\t\t\tfontsize = fontsize / textlines.length;\n\t\t\t\t\tcontext.font = fontsize+ 'pt '+font.type;\n\t\t\t\t\tcontextBump.font = fontsize+ 'pt '+font.type;\n\t\t\t\t\tcontextEmissive.font = fontsize+ 'pt '+font.type;\n\n\t\t\t\t\t//to find the correct text height for every possible fonts, we have no choice but to use the great (and complex) pixi method\n\t\t\t\t\t//First we create a PIXI.TextStyle object, to pass later to the measure method\n\t\t\t\t\tlet pixiStyle = new PIXI.TextStyle({\n\t\t\t\t\t\tfontFamily: font.type,\n\t\t\t\t\t\tfontSize: fontsize,\n\t\t\t\t\t\tstroke: \"#0000FF\",\n\t\t\t\t\t\tstrokeThickness: (outlinecolor != 'none' && outlinecolor != backcolor) ? 1:0\n\t\t\t\t\t});\n\t\t\t\t\t//Then we call the PIXI measureText method\n\t\t\t\t\tlet textMetrics = PIXI.TextMetrics.measureText(textlines.join(\"\"),pixiStyle);\n\n\t\t\t\t\tlineHeight = textMetrics.lineHeight;\n\t\t\t\t\tif(textlines[0]!=\"\"){\n\t\t\t\t\t\ttextstarty -= (lineHeight * textlines.length) / 2;\n\t\t\t\t\t\t//On a D12, we add a little padding because it looks better to human eyes even tho it's not really the center anymore\n\t\t\t\t\t\tif(diceobj.shape == \"d12\")\n\t\t\t\t\t\t\ttextstarty = textstarty *1.08;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\ttextlines.shift();\n\t\t\t\t}\n\n\t\t\t\tfor(let i = 0, l = textlines.length; i < l; i++){\n\t\t\t\t\tlet textline = textlines[i].trim();\n\n\t\t\t\t\t// attempt to outline the text with a meaningful color\n\t\t\t\t\tif (outlinecolor != 'none' && outlinecolor != backcolor) {\n\t\t\t\t\t\tcontext.strokeStyle = outlinecolor;\n\t\t\t\t\t\tcontext.lineWidth = 5;\n\t\t\t\t\t\tcontext.strokeText(textlines[i], textstartx+x, textstarty+y);\n\n\t\t\t\t\t\tcontextBump.strokeStyle = \"#555555\";\n\t\t\t\t\t\tcontextBump.lineWidth = 5;\n\t\t\t\t\t\tcontextBump.strokeText(textlines[i], textstartx+x, textstarty+y);\n\n\t\t\t\t\t\tcontextEmissive.strokeStyle = \"#999999\";\n\t\t\t\t\t\tcontextEmissive.lineWidth = 5;\n\t\t\t\t\t\tcontextEmissive.strokeText(textlines[i], textstartx+x, textstarty+y);\n\n\t\t\t\t\t\tif (textline == '6' || textline == '9') {\n\t\t\t\t\t\t\tcontext.strokeText(' .', textstartx+x, textstarty+y);\n\t\t\t\t\t\t\tcontextBump.strokeText(' .', textstartx+x, textstarty+y);\n\t\t\t\t\t\t\tcontextEmissive.strokeText(' .', textstartx+x, textstarty+y);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcontext.fillStyle = forecolor;\n\t\t\t\t\tcontext.fillText(textlines[i], textstartx+x, textstarty+y);\n\n\t\t\t\t\tcontextBump.fillStyle = \"#555555\";\n\t\t\t\t\tcontextBump.fillText(textlines[i], textstartx+x, textstarty+y);\n\n\t\t\t\t\tcontextEmissive.fillStyle = \"#999999\";\n\t\t\t\t\tcontextEmissive.fillText(textlines[i], textstartx+x, textstarty+y);\n\n\t\t\t\t\tif (textline == '6' || textline == '9') {\n\t\t\t\t\t\tcontext.fillText(' .', textstartx+x, textstarty+y);\n\t\t\t\t\t\tcontextBump.fillText(' .', textstartx+x, textstarty+y);\n\t\t\t\t\t\tcontextEmissive.fillText(' .', textstartx+x, textstarty+y);\n\t\t\t\t\t}\n\t\t\t\t\ttextstarty += (lineHeight * 1.5);\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tvar hw = (ts / 2);\n\t\t\tvar hh = (ts / 2);\n\t\t\tlet fontsize = (ts / 128 * 24);\n\t\t\tif(font.scale)\n\t\t\t\tfontsize *= font.scale;\n\t\t\tcontext.font = fontsize+'pt '+font.type;\n\t\t\tcontextBump.font = fontsize+'pt '+font.type;\n\t\t\tcontextEmissive.font = fontsize+'pt '+font.type;\n\n\t\t\t//draw the numbers\n\t\t\tlet wShift = 1;\n\t\t\tlet hShift = 1;\n\t\t\tfor (let i=0;i<text.length;i++) {\n\t\t\t\tif(materialData.isGhost)\n\t\t\t\t\ttext[i] = \"?\";\n\t\t\t\tswitch(i){\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\thShift = 1.13;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\thShift=0.87;\n\t\t\t\t\t\twShift=1.13;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\twShift = 0.87;\n\t\t\t\t}\n\t\t\t\tlet destX = hw*wShift+x;\n\t\t\t\tlet destY = (hh - ts * 0.3)*hShift+y;\n\t\t\t\t//custom texture face\n\t\t\t\tif(text[i] instanceof HTMLImageElement){\n\t\t\t\t\tisTexture = true;\n\t\t\t\t\tlet textureSize = 60 / (text[i].width / ts);\n\t\t\t\t\tcontext.drawImage(text[i],0,0,text[i].width,text[i].height,destX-(textureSize/2),destY-(textureSize/2),textureSize,textureSize);\n\t\t\t\t\t//There's an issue with bump texture because they are smaller than the dice face so it causes visual glitches\n\t\t\t\t\t/*if(bump)\n\t\t\t\t\t\tcontextBump.drawImage(text[i],0,0,text[i].width,text[i].height,destX-(textureSize/2),destY-(textureSize/2),textureSize,textureSize);*/\n\t\t\t\t\tif(emissive)\n\t\t\t\t\t\tcontextEmissive.drawImage(text[i],0,0,text[i].width,text[i].height,destX-(textureSize/2),destY-(textureSize/2),textureSize,textureSize);\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\t// attempt to outline the text with a meaningful color\n\t\t\t\t\tif (outlinecolor != 'none' && outlinecolor != backcolor) {\n\t\t\t\t\t\tcontext.strokeStyle = outlinecolor;\n\t\t\t\t\t\t\n\t\t\t\t\t\tcontext.lineWidth = 5;\n\t\t\t\t\t\tcontext.strokeText(text[i], destX, destY);\n\n\t\t\t\t\t\tcontextBump.strokeStyle = \"#555555\";\n\t\t\t\t\t\tcontextBump.lineWidth = 5;\n\t\t\t\t\t\tcontextBump.strokeText(text[i], destX, destY);\n\n\t\t\t\t\t\tcontextEmissive.strokeStyle = \"#999999\";\n\t\t\t\t\t\tcontextEmissive.lineWidth = 5;\n\t\t\t\t\t\tcontextEmissive.strokeText(text[i], destX, destY);\n\t\t\t\t\t}\n\n\t\t\t\t\t//draw label in top middle section\n\t\t\t\t\tcontext.fillStyle = forecolor;\n\t\t\t\t\tcontext.fillText(text[i], destX, destY);\n\t\t\t\t\tcontextBump.fillStyle = \"#555555\";\n\t\t\t\t\tcontextBump.fillText(text[i], destX, destY);\n\t\t\t\t\tcontextEmissive.fillStyle = \"#999999\";\n\t\t\t\t\tcontextEmissive.fillText(text[i], destX, destY);\n\t\t\t\t\t//var img = canvas.toDataURL(\"image/png\");\n\t\t\t\t\t//document.write('<img src=\"'+img+'\"/>');\n\t\t\t\t}\n\n\t\t\t\t//rotate 1/3 for next label\n\t\t\t\tcontext.translate(hw+x, hh+y);\n\t\t\t\tcontext.rotate(Math.PI * 2 / 3);\n\t\t\t\tcontext.translate(-hw-x, -hh-y);\n\n\t\t\t\tcontextBump.translate(hw+x, hh+y);\n\t\t\t\tcontextBump.rotate(Math.PI * 2 / 3);\n\t\t\t\tcontextBump.translate(-hw-x, -hh-y);\n\n\t\t\t\tcontextEmissive.translate(hw+x, hh+y);\n\t\t\t\tcontextEmissive.rotate(Math.PI * 2 / 3);\n\t\t\t\tcontextEmissive.translate(-hw-x, -hh-y);\n\t\t\t}\n\t\t}\n\t}\n\n\tgetAppearanceForDice(appearances, dicetype, dicenotation = null){\n\t\t/*\n\t\t\tWe use either (by order of priority): \n\t\t\t1) A notation appearance\n\t\t\t2) A flavor/notation colorset\n\t\t\t3) The colorset of the diceobj\n\t\t\t4) The colorset configured by the player for this dice type\n\t\t\t5) A preferred system set by a module/system (done in main.js)\n\t\t\t6) The global colorset of the player\n\t\t*/\n\t\t\n\t\tlet settings;\n\t\tif(appearances[dicetype])\n\t\t\tsettings = appearances[dicetype];\n\t\telse\n\t\t\tsettings = appearances.global;\n\n\t\t//To keep compatibility with both older integrations and user settings, we use the DiceColor naming convention from there\n\t\tlet appearance = {\n\t\t\tcolorset: settings.colorset ? settings.colorset : appearances.global.colorset ? appearances.global.colorset : \"custom\",\n\t\t\tforeground: settings.labelColor ? settings.labelColor:appearances.global.labelColor ? appearances.global.labelColor : \"#FFFFFF\",\n\t\t\tbackground: settings.diceColor ? settings.diceColor:appearances.global.diceColor ? appearances.global.diceColor : \"#000000\",\n\t\t\t//outline: settings.outlineColor ? settings.outlineColor: appearances.global.outlineColor ? appearances.global.outlineColor : \"\",\n\t\t\t//edge: settings.edgeColor ? settings.edgeColor:appearances.global.edgeColor ? appearances.global.edgeColor:\"\",\n\t\t\ttexture: settings.texture ? settings.texture:appearances.global.texture ? appearances.global.texture : \"none\",\n\t\t\tmaterial: settings.material ? settings.material:appearances.global.material ? appearances.global.material : \"auto\",\n\t\t\tfont: settings.font ? settings.font:appearances.global.font ? appearances.global.font : \"Arial\",\n\t\t\tsystem: settings.system ? settings.system:appearances.global.system ? appearances.global.system : \"standard\"\n\t\t};\n\n\t\tif(appearance.colorset == \"custom\"){\n\t\t\tappearance.outline = settings.outlineColor ? settings.outlineColor:\"\";\n\t\t\tappearance.edge = settings.edgeColor ? settings.edgeColor:\"\";\n\t\t} else {\n\t\t\tappearance.outline = settings.outlineColor ? settings.outlineColor: appearances.global.outlineColor ? appearances.global.outlineColor : \"\";\n\t\t\tappearance.edge = settings.edgeColor ? settings.edgeColor:appearances.global.edgeColor ? appearances.global.edgeColor:\"\";\n\t\t}\n\n\t\tif(appearance.colorset && appearance.colorset != \"custom\"){\n\t\t\tlet colorsetData = DiceColors.getColorSet(appearance.colorset);\n\t\t\tappearance.foreground = colorsetData.foreground;\n\t\t\tappearance.background = colorsetData.background;\n\t\t\tappearance.outline = colorsetData.outline;\n\t\t\tappearance.edge = colorsetData.edge ? colorsetData.edge : \"\";\n\t\t}\n\t\tlet diceobj = this.getPresetBySystem(dicetype,appearance.system);\n\t\tif(diceobj.colorset){\n\t\t\tlet colorsetData = {...DiceColors.getColorSet(diceobj.colorset)};\n\t\t\tObject.entries(colorsetData).forEach((opt) => {\n\t\t\t\tif(opt[1] == \"custom\")\n\t\t\t\t\tdelete colorsetData[opt[0]];\n\t\t\t});\n\t\t\tfoundry.utils.mergeObject(appearance, colorsetData,{performDeletions:true});\n\t\t\tappearance.colorset = diceobj.colorset;\n\t\t}\n\t\t\n\t\tif(dicenotation){\n\t\t\tlet colorset = null;\n\t\t\tif (dicenotation.options.colorset)\n\t\t\t\tcolorset = dicenotation.options.colorset;\n\t\t\telse if (dicenotation.options.flavor && COLORSETS[dicenotation.options.flavor]) {\n\t\t\t\tcolorset = dicenotation.options.flavor;\n\t\t\t}\n\t\t\tif(colorset){\n\t\t\t\tlet colorsetData = DiceColors.getColorSet(colorset);\n\t\t\t\tcolorsetData.edge = colorsetData.edge ? colorsetData.edge : \"\";\n\t\t\t\tappearance = colorsetData;\n\t\t\t}\n\t\t\tif(dicenotation.options.appearance){\n\t\t\t\tfoundry.utils.mergeObject(appearance, dicenotation.options.appearance,{performDeletions:true});\n\t\t\t}\n\t\t\tif(dicenotation.options.ghost){\n\t\t\t\tappearance.isGhost = true;\n\t\t\t}\n\t\t}\n\t\treturn appearance;\n\t}\n\n\tgenerateMaterialData(diceobj, appearance) {\n\t\tlet materialData = {};\n\t\tlet colorindex;\n\n\t\tif(appearance.texture && !appearance.texture.id)\n\t\t\tappearance.texture = DiceColors.getTexture(appearance.texture);\n\n\t\tlet colorsetData = DiceColors.getColorSet(appearance.colorset);\n\n\t\t// ignore custom colorset with unset properties\n\t\tif(colorsetData.foreground == \"custom\")\n\t\t\tcolorsetData.foreground = appearance.foreground;\n\t\tif(colorsetData.background == \"custom\")\n\t\t\tcolorsetData.background = appearance.background;\n\t\tif(colorsetData.texture == \"custom\")\n\t\t\tcolorsetData.texture = appearance.texture;\n\t\tif(colorsetData.material == \"custom\")\n\t\t\tcolorsetData.material = appearance.material;\n\t\tif(colorsetData.font == \"custom\")\n\t\t\tcolorsetData.font = appearance.font;\n\n\n\t\t// set base color first\n\t\tif (Array.isArray(appearance.background)) {\n\n\t\t\tcolorindex = Math.floor(Math.random() * appearance.background.length);\n\n\t\t\t// if color list and label list are same length, treat them as a parallel list\n\t\t\tif (Array.isArray(appearance.foreground) && appearance.foreground.length == appearance.background.length) {\n\t\t\t\tmaterialData.foreground = appearance.foreground[colorindex];\n\n\t\t\t\t// if label list and outline list are same length, treat them as a parallel list\n\t\t\t\tif (Array.isArray(appearance.outline) && appearance.outline.length == appearance.foreground.length) {\n\t\t\t\t\tmaterialData.outline = appearance.outline[colorindex];\n\t\t\t\t}\n\t\t\t}\n\t\t\t// if texture list is same length do the same\n\t\t\tif (Array.isArray(appearance.texture) && appearance.texture.length == appearance.background.length) {\n\t\t\t\tmaterialData.texture = appearance.texture[colorindex];\n\t\t\t}\n\n\t\t\t//if edge list and color list are same length, treat them as a parallel list\n\t\t\tif (Array.isArray(appearance.edge) && appearance.edge.length == appearance.background.length) {\n\t\t\t\tmaterialData.edge = appearance.edge[colorindex];\n\t\t\t}\n\n\t\t\tmaterialData.background = appearance.background[colorindex];\n\t\t} else {\n\t\t\tmaterialData.background = appearance.background;\n\t\t}\n\n\t\tif(!materialData.edge){\n\t\t\tif (Array.isArray(appearance.edge)) {\n\t\t\t\tcolorindex = Math.floor(Math.random() * appearance.edge.length);\n\t\t\t\tmaterialData.edge = appearance.edge[colorindex];\n\t\t\t}\n\t\t\telse\n\t\t\t\tmaterialData.edge = appearance.edge;\n\t\t}\n\n\t\t// if selected label color is still not set, pick one\n\t\tif(!materialData.foreground){\n\t\t\tif(Array.isArray(appearance.foreground)){\n\t\t\t\tcolorindex = appearance.foreground[Math.floor(Math.random() * appearance.foreground.length)];\n\n\t\t\t\t// if label list and outline list are same length, treat them as a parallel list\n\t\t\t\tif (Array.isArray(appearance.outline) && appearance.outline.length == appearance.foreground.length) {\n\t\t\t\t\tmaterialData.outline = appearance.outline[colorindex];\n\t\t\t\t}\n\n\t\t\t\tmaterialData.foreground = appearance.foreground[colorindex];\n\t\t\t}\n\t\t\telse\n\t\t\t\tmaterialData.foreground = appearance.foreground;\n\t\t}\n\n\t\t// if selected label outline is still not set, pick one\n\t\tif (!materialData.outline){\n\t\t\tif(Array.isArray(appearance.outline)) {\n\t\t\t\tcolorindex = appearance.outline[Math.floor(Math.random() * appearance.outline.length)];\n\n\t\t\t\tmaterialData.outline = appearance.outline[colorindex];\n\t\t\t} else {\n\t\t\t\tmaterialData.outline = appearance.outline;\n\t\t\t}\n\t\t}\n\n\t\t// same for textures list\n\t\tif(!materialData.texture){\n\t\t\tif (Array.isArray(appearance.texture)) {\n\t\t\t\tmaterialData.texture = appearance.texture[Math.floor(Math.random() * appearance.texture.length)];\n\t\t\t} else if(appearance.texture.name == \"none\"){\n\t\t\t\t//set to none/theme\n\t\t\t\tif (Array.isArray(colorsetData.texture)){\n\t\t\t\t\tmaterialData.texture = colorsetData.texture[Math.floor(Math.random() * colorsetData.texture.length)];\n\t\t\t\t} else {\n\t\t\t\t\tmaterialData.texture = colorsetData.texture;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmaterialData.texture = appearance.texture;\n\t\t\t}\n\t\t}\n\n\t\t//Same for material\n\t\tlet baseTexture = Array.isArray(materialData.texture) ? materialData.texture[0]:materialData.texture;\n\n\t\tif(appearance.material == \"auto\" || appearance.material == \"\"){\n\t\t\tif(colorsetData.material)\n\t\t\t\tmaterialData.material = colorsetData.material;\n\t\t\telse\n\t\t\t\tmaterialData.material = baseTexture.material;\n\t\t} else {\n\t\t\tmaterialData.material = appearance.material;\n\t\t}\n\n\t\t//for font, we priorize the dicepreset font, then custom, then coloret\n\t\tif(appearance.font == \"auto\"){\n\t\t\tif(diceobj.font){\n\t\t\t\tmaterialData.font = diceobj.font;\n\t\t\t} else {\n\t\t\t\tmaterialData.font = colorsetData.font;\n\t\t\t}\n\t\t} else {\n\t\t\tmaterialData.font = appearance.font;\n\t\t}\n\n\t\tif(appearance.fontScale)\n\t\t\tmaterialData.fontScale = appearance.fontScale;\n\t\telse if(diceobj.fontScale){\n\t\t\tmaterialData.fontScale = diceobj.fontScale;\n\t\t} else {\n\t\t\tmaterialData.fontScale = colorsetData.fontScale;\n\t\t}\n\n\t\tmaterialData.isGhost = appearance.isGhost?appearance.isGhost:false;\n\n\t\tmaterialData.cacheString = appearance.system+materialData.background+materialData.foreground+materialData.outline+materialData.texture.name+materialData.edge+materialData.material+materialData.font+materialData.isGhost;\n\t\treturn materialData;\n\t}\n\n\tcalc_texture_size(approx, ceil = false) {\n\t\tlet size = 0;\n\t\tif(!ceil)\n\t\t\tsize = Math.pow(2, Math.floor(Math.log(approx) / Math.log(2)));\n\t\telse\n\t\t\tsize = Math.pow(2, Math.ceil(Math.log(approx) / Math.log(2)));\n\t\treturn size;\n\t}\n\n\tcreateGeometry(type, typeScale, scopedScale) {\n\t\tlet radius = typeScale * scopedScale;\n\t\tlet geom = null;\n\t\tswitch (type) {\n\t\t\tcase 'd2':\n\t\t\t\tgeom = this.create_d2_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd4':\n\t\t\t\tgeom = this.create_d4_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd6':\n\t\t\t\tgeom = this.create_d6_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd8':\n\t\t\t\tgeom = this.create_d8_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd10':\n\t\t\t\tgeom = this.create_d10_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd12':\n\t\t\t\tgeom = this.create_d12_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd14':\n\t\t\t\tgeom = this.create_d14_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd16':\n\t\t\t\tgeom = this.create_d16_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd20':\n\t\t\t\tgeom = this.create_d20_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd24':\n\t\t\t\tgeom = this.create_d24_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd30':\n\t\t\t\tgeom = this.create_d30_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t}\n\t\treturn geom;\n\t}\n\n\tload_geometry(type, scopedScale){\n\t\tvar loader = new THREE.BufferGeometryLoader();\n\t\tlet bufferGeometry = loader.parse(DICE_MODELS[type]);\n\t\tbufferGeometry.scale(scopedScale/100,scopedScale/100,scopedScale/100);\n\t\treturn bufferGeometry;\n\t}\n\n\tcreate_d2_geometry(radius, scopedScale){\n\t\tlet geom = this.load_geometry(\"d2\",scopedScale);\n\t\tgeom.cannon_shape = new CANNON.Cylinder(1*radius,1*radius,0.1*radius,8);\n\t\treturn geom;\n\t}\n\n\tcreate_d4_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d4\",scopedScale);\n\t\tvar vertices = [[1, 1, 1], [-1, -1, 1], [-1, 1, -1], [1, -1, -1]];\n\t\tvar faces = [[1, 0, 2, 1], [0, 1, 3, 2], [0, 3, 2, 3], [1, 2, 3, 4]];\n\t\tgeom.cannon_shape = this.create_geom(vertices, faces, radius);\n\t\treturn geom;\n\t}\n\n\tcreate_d6_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d6\",scopedScale);\n\t\tvar vertices = [[-1, -1, -1], [1, -1, -1], [1, 1, -1], [-1, 1, -1],\n\t\t\t\t[-1, -1, 1], [1, -1, 1], [1, 1, 1], [-1, 1, 1]];\n\t\tvar faces = [[0, 3, 2, 1, 1], [1, 2, 6, 5, 2], [0, 1, 5, 4, 3],\n\t\t\t\t[3, 7, 6, 2, 4], [0, 4, 7, 3, 5], [4, 5, 6, 7, 6]];\n\t\tgeom.cannon_shape = this.create_geom(vertices, faces, radius);\n\t\treturn geom;\n\t}\n\n\tcreate_d8_geometry(radius, scopedScale) {\n\t\tlet geometry = this.load_geometry(\"d8\",scopedScale);\n\t\t\n\t\tvar vertices = [[1, 0, 0], [-1, 0, 0], [0, 1, 0], [0, -1, 0], [0, 0, 1], [0, 0, -1]];\n\t\tvar faces = [[0, 2, 4, 1], [0, 4, 3, 2], [0, 3, 5, 3], [0, 5, 2, 4], [1, 3, 4, 5],\n\t\t\t\t[1, 4, 2, 6], [1, 2, 5, 7], [1, 5, 3, 8]];\n\t\tgeometry.cannon_shape = this.create_geom(vertices, faces, radius);\n\t\treturn geometry;\n\t}\n\n\tcreate_d10_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d10\",scopedScale);\n\t\t//geom.scale(1.38,1.38,1.38);\n\t\t\n\t\tvar a = Math.PI * 2 / 10, h = 0.105, v = -1;\n\t\tvar vertices = [];\n\t\tfor (var i = 0, b = 0; i < 10; ++i, b += a) {\n\t\t\tvertices.push([Math.cos(b), Math.sin(b), h * (i % 2 ? 1 : -1)]);\n\t\t}\n\t\tvertices.push([0, 0, -1]);\n\t\tvertices.push([0, 0, 1]);\n\n\t\tvar faces = [\n [5, 6, 7, 11, 0],\n [4, 3, 2, 10, 1],\n [1, 2, 3, 11, 2],\n [0, 9, 8, 10, 3],\n [7, 8, 9, 11, 4],\n [8, 7, 6, 10, 5],\n [9, 0, 1, 11, 6],\n [2, 1, 0, 10, 7],\n [3, 4, 5, 11, 8],\n [6, 5, 4, 10, 9]\n ];\n\t\tgeom.cannon_shape = this.create_geom(vertices, faces, radius);\n\t\t//geom = this.scaleGeometryToShape(geom);\n\t\treturn geom;\n\t}\n\n\tcreate_d12_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d12\",scopedScale);\n\t\tvar p = (1 + Math.sqrt(5)) / 2, q = 1 / p;\n\t\tvar vertices = [[0, q, p], [0, q, -p], [0, -q, p], [0, -q, -p], [p, 0, q],\n\t\t\t\t[p, 0, -q], [-p, 0, q], [-p, 0, -q], [q, p, 0], [q, -p, 0], [-q, p, 0],\n\t\t\t\t[-q, -p, 0], [1, 1, 1], [1, 1, -1], [1, -1, 1], [1, -1, -1], [-1, 1, 1],\n\t\t\t\t[-1, 1, -1], [-1, -1, 1], [-1, -1, -1]];\n\t\tvar faces = [[2, 14, 4, 12, 0, 1], [15, 9, 11, 19, 3, 2], [16, 10, 17, 7, 6, 3], [6, 7, 19, 11, 18, 4],\n\t\t\t\t[6, 18, 2, 0, 16, 5], [18, 11, 9, 14, 2, 6], [1, 17, 10, 8, 13, 7], [1, 13, 5, 15, 3, 8],\n\t\t\t\t[13, 8, 12, 4, 5, 9], [5, 4, 14, 9, 15, 10], [0, 12, 8, 10, 16, 11], [3, 19, 7, 17, 1, 12]];\n\n\t\tgeom.cannon_shape = this.create_geom(vertices, faces, radius);\n\t\treturn geom;\n\t}\n\n\tcreate_d14_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d14\",scopedScale);\n\n\t\tvar vertices = [[-0.005093127489089966, 1.177548885345459, 0.002782404189929366], [-0.9908595681190491, 0.061759304255247116, 0.22585006058216095], [-0.9924551844596863, -0.06095181778073311, -0.23028047382831573], [-0.7984917163848877, 0.061637163162231445, -0.6402497291564941], [-0.4453684985637665, -0.06121010705828667, -0.9239609241485596], [-0.00504341721534729, 0.06129471957683563, -1.0241185426712036], [0.437289297580719, -0.06156954541802406, -0.9219886660575867], [0.7920035719871521, 0.06098949536681175, -0.6366959810256958], [0.9908595681190491, -0.06175928935408592, -0.22585000097751617], [0.9924551844596863, 0.0609518401324749, 0.23028059303760529], [0.7984917163848877, -0.061637137085199356, 0.6402497291564941], [0.4453684985637665, 0.061210136860609055, 0.9239609241485596], [0.00504341721534729, -0.06129469349980354, 1.0241185426712036], [-0.4372892379760742, 0.061569564044475555, 0.9219887852668762], [-0.7920035719871521, -0.060989461839199066, 0.6366960406303406], [0.005093127489089966, -1.177548885345459, -0.002782404189929366]];\n\t\tvar faces = [[0, 3, 2, 1], [1, 14, 13, 0], [12, 11, 0, 13], [10, 9, 0, 11], [8, 7, 0, 9], [6, 5, 0, 7], [4, 3, 0, 5], [10, 11, 12, 15], [14, 15, 12, 13], [2, 15, 14, 1], [2, 3, 4, 15], [4, 5, 6, 15], [6, 7, 8, 15], [8, 9, 10, 15]];\n\t\tgeom.cannon_shape = this.create_geom_dcc(vertices, faces, radius * 0.85);\n\t\treturn geom;\n\t}\n\n\tcreate_d16_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d16\",scopedScale);\n\n\t\tvar vertices = [[-1.0301814079284668, 0.002833150327205658, 1.0244150161743164], [-0.0018179342150688171, -0.006610371172428131, -1.4427297115325928], [1.4587815999984741, 0.0028328225016593933, -0.006545569747686386], [1.031739592552185, 0.0028328821063041687, -1.0375059843063354], [-1.4572231769561768, 0.0028332099318504333, -0.006545361131429672], [-1.0301814079284668, 0.002833150327205658, -1.0375059843063354], [1.031739592552185, 0.0028328821063041687, 1.0244150161743164], [-0.0018179342150688171, -0.006610371172428131, 1.4732751846313477], [0.0007793977856636047, 1.4608354568481445, -0.006545450538396835], [-0.0018181726336479187, -1.4646127223968506, 0.015272742137312889]];\n\t\tvar faces = [[5, 8, 1], [5, 4, 8], [4, 0, 8], [0, 7, 8], [8, 7, 6], [8, 6, 2], [2, 3, 8], [3, 1, 8], [3, 9, 1], [2, 9, 3], [6, 9, 2], [6, 7, 9], [0, 9, 7], [4, 9, 0], [5, 9, 4], [5, 1, 9]];\n\t\tgeom.cannon_shape = this.create_geom_dcc(vertices, faces, radius * 0.83);\n\t\treturn geom;\n\t}\n\n\tcreate_d20_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d20\",scopedScale);\n\n\t\tvar t = (1 + Math.sqrt(5)) / 2;\n\t\tvar vertices = [[-1, t, 0], [1, t, 0 ], [-1, -t, 0], [1, -t, 0],\n\t\t\t\t[0, -1, t], [0, 1, t], [0, -1, -t], [0, 1, -t],\n\t\t\t\t[t, 0, -1], [t, 0, 1], [-t, 0, -1], [-t, 0, 1]];\n\t\tvar faces = [[0, 11, 5, 1], [0, 5, 1, 2], [0, 1, 7, 3], [0, 7, 10, 4], [0, 10, 11, 5],\n\t\t\t\t[1, 5, 9, 6], [5, 11, 4, 7], [11, 10, 2, 8], [10, 7, 6, 9], [7, 1, 8, 10],\n\t\t\t\t[3, 9, 4, 11], [3, 4, 2, 12], [3, 2, 6, 13], [3, 6, 8, 14], [3, 8, 9, 15],\n\t\t\t\t[4, 9, 5, 16], [2, 4, 11, 17], [6, 2, 10, 18], [8, 6, 7, 19], [9, 8, 1, 20]];\n\t\tgeom.cannon_shape = this.create_geom(vertices, faces, radius);\n\t\treturn geom;\n\t}\n\n\tcreate_d24_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d24\",scopedScale);\n\n\t\tvar vertices = [[0.7070000171661377, -0.0, -0.7070000171661377], [0.7070000171661377, 0.7070000171661377, -0.0], [0.5468999743461609, 0.5468999743461609, -0.5468999743461609], [-0.0, -0.7070000171661377, -0.7070000171661377], [-0.0, 0.7070000171661377, -0.7070000171661377], [-0.5468999743461609, 0.5468999743461609, -0.5468999743461609], [-0.5468999743461609, -0.5468999743461609, -0.5468999743461609], [0.5468999743461609, 0.5468999743461609, 0.5468999743461609], [-0.0, -0.0, -1.0], [1.0, -0.0, -0.0], [0.5468999743461609, -0.5468999743461609, -0.5468999743461609], [-0.5468999743461609, 0.5468999743461609, 0.5468999743461609], [-0.0, -0.0, 1.0], [-0.0, 0.7070000171661377, 0.7070000171661377], [-0.0, 1.0, -0.0], [-0.7070000171661377, 0.7070000171661377, -0.0], [-0.7070000171661377, -0.0, -0.7070000171661377], [-0.7070000171661377, -0.7070000171661377, -0.0], [-0.0, -0.7070000171661377, 0.7070000171661377], [-0.5468999743461609, -0.5468999743461609, 0.5468999743461609], [-1.0, 0.0, -0.0], [0.5468999743461609, -0.5468999743461609, 0.5468999743461609], [0.7070000171661377, -0.0, 0.7070000171661377], [-0.0, -1.0, -0.0], [0.7070000171661377, -0.7070000171661377, -0.0], [-0.7070000171661377, -0.0, 0.7070000171661377]];\n\t\tvar faces = [[4, 5, 15, 14], [3, 10, 24, 23], [11, 15, 20, 25], [10, 3, 8, 0], [19, 18, 12, 25], [7, 22, 9, 1], [22, 21, 24, 9], [7, 13, 12, 22], [5, 4, 8, 16], [20, 17, 19, 25], [6, 3, 23, 17], [2, 4, 14, 1], [18, 19, 17, 23], [13, 7, 1, 14], [0, 2, 1, 9], [18, 21, 22, 12], [3, 6, 16, 8], [15, 5, 16, 20], [6, 17, 20, 16], [4, 2, 0, 8], [13, 11, 25, 12], [24, 10, 0, 9], [11, 13, 14, 15], [21, 18, 23, 24]];\n\t\tgeom.cannon_shape = this.create_geom(vertices, faces, radius);\n\t\treturn geom;\n\t}\n\n\tcreate_d30_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d30\",scopedScale);\n\n\t\tvar vertices = [[-1.6180000305175781, 0.0, 1.0], [-1.6180000305175781, 0.6179999709129333, -0.0], [-0.0, 1.6180000305175781, 0.6179999709129333], [0.6179999709129333, 0.0, 1.6180000305175781], [-1.0, -1.6180000305175781, -0.0], [1.6180000305175781, 0.0, 1.0], [-1.6180000305175781, -0.6179999709129333, -0.0], [-0.6179999709129333, 0.0, 1.6180000305175781], [-0.0, 1.0, -1.6180000305175781], [-1.0, 1.0, -1.0], [1.6180000305175781, 0.6179999709129333, -0.0], [1.0, -1.6180000305175781, -0.0], [-1.0, -1.0, -1.0], [1.6180000305175781, -0.6179999709129333, -0.0], [-1.0, 1.6180000305175781, -0.0], [1.0, 1.0, -1.0], [1.0, 1.6180000305175781, -0.0], [-0.0, 1.0, 1.6180000305175781], [1.0, -1.0, -1.0], [-0.6179999709129333, 0.0, -1.6180000305175781], [-0.0, -1.0, -1.6180000305175781], [-1.0, 1.0, 1.0], [0.6179999709129333, 0.0, -1.6180000305175781], [-0.0, -1.0, 1.6180000305175781], [-1.0, -1.0, 1.0], [-0.0, 1.6180000305175781, 0.6179999709129333], [-1.6180000305175781, 0.0, -1.0], [1.0, 1.0, 1.0], [-0.0, -1.6180000305175781, -0.6179999709129333], [1.6180000305175781, 0.0, -1.0], [1.0, -1.0, 1.0], [-0.0, 1.6180000305175781, -0.6179999709129333], [-0.0, -1.6180000305175781, 0.6179999709129333]];\n\t\tvar faces = [[25, 16, 31, 14], [7, 0, 24, 23], [19, 20, 12, 26], [13, 5, 30, 11], [1, 0, 21, 14], [10, 29, 15, 16], [6, 0, 1, 26], [22, 29, 18, 20], [9, 14, 31, 8], [28, 4, 12, 20], [30, 5, 3, 23], [12, 4, 6, 26], [31, 16, 15, 8], [21, 17, 25, 14], [22, 20, 19, 8], [3, 17, 7, 23], [18, 11, 28, 20], [32, 23, 24, 4], [27, 5, 10, 16], [9, 8, 19, 26], [25, 17, 27, 16], [30, 23, 32, 11], [7, 17, 21, 0], [10, 5, 13, 29], [24, 0, 6, 4], [13, 11, 18, 29], [9, 26, 1, 14], [3, 5, 27, 17], [15, 29, 22, 8], [28, 11, 32, 4]];\n\t\tgeom.cannon_shape = this.create_geom_dcc(vertices, faces, radius);\n\t\treturn geom;\n\t}\n\n\tcreate_shape(vertices, faces, radius) {\n\t\tvar cv = new Array(vertices.length), cf = new Array(faces.length);\n\t\tfor (var i = 0; i < vertices.length; ++i) {\n\t\t\tvar v = vertices[i];\n\t\t\tcv[i] = new CANNON.Vec3(v.x * radius, v.y * radius, v.z * radius);\n\t\t}\n\t\tfor (var i = 0; i < faces.length; ++i) {\n\t\t\tcf[i] = faces[i].slice(0, faces[i].length - 1);\n\t\t}\n\t\treturn new CANNON.ConvexPolyhedron(cv, cf);\n\t}\n\n\tcreate_geom(vertices, faces, radius) {\n\t\tvar vectors = new Array(vertices.length);\n\t\tfor (var i = 0; i < vertices.length; ++i) {\n\t\t\tvectors[i] = (new THREE.Vector3).fromArray(vertices[i]).normalize();\n\t\t}\n\t\tlet cannon_shape = this.create_shape(vectors, faces, radius);\n\t\treturn cannon_shape;\n\t}\n\n\tcreate_shape_dcc(vertices, faces, radius) {\n\t\tvar cv = new Array(vertices.length), cf = new Array(faces.length);\n\t\tfor (var i = 0; i < vertices.length; ++i) {\n\t\t\tvar v = vertices[i];\n\t\t\tcv[i] = new CANNON.Vec3(v.x * radius, v.y * radius, v.z * radius);\n\t\t}\n\t\tfor (var i = 0; i < faces.length; ++i) {\n\t\t\tcf[i] = faces[i];//.slice(0, faces[i].length - 1);\n\t\t}\n\t\treturn new CANNON.ConvexPolyhedron(cv, cf);\n\t}\n\n\tcreate_geom_dcc(vertices, faces, radius) {\n\t\tvar vectors = new Array(vertices.length);\n\t\tfor (var i = 0; i < vertices.length; ++i) {\n\t\t\tvectors[i] = (new THREE.Vector3).fromArray(vertices[i]).normalize();\n\t\t}\n\t\tlet cannon_shape = this.create_shape_dcc(vectors, faces, radius);\n\t\treturn cannon_shape;\n\t}\n}\n","export class DiceSFX {\n get nameLocalized(){\n return game.i18n.localize(this._name);\n }\n \n constructor(box, dicemesh, options){\n const defaultOptions = {\n isGlobal : false,\n muteSound : false\n };\n\n this.options = foundry.utils.mergeObject(defaultOptions, options);\n\n this.dicemesh = dicemesh;\n this.box = box;\n this.destroyed = false;\n this.enableGC = false;\n this.renderReady = false;\n this.volume = (dicemesh.body_sim.secretRoll && box.muteSoundSecretRolls) || this.options.muteSound ? 0 : this.box.volume;\n }\n\n static async init(){\n return true;\n }\n\n async play(){\n return Promise.resolve();\n }\n\n static async loadAsset(loader,url) {\n return new Promise((resolve, reject) => {\n loader.load(url, data=> resolve(data), null, reject);\n });\n }\n\n static getDialogContent(sfxLine,id){\n let dialogContent = {};\n let disabled = game.user.isGM ? '':'disabled=\"disabled\"';\n dialogContent.content = `<div class=\"form-group\">\n <label>{{localize \"DICESONICE.sfxOptionsIsGlobal\"}}</label>\n <div class=\"form-fields\">\n <input type=\"checkbox\" name=\"sfxLine[{{id}}][options][isGlobal]\" data-dtype=\"Boolean\" ${disabled} {{checked isGlobal}} />\n </div>\n </div>\n <div class=\"form-group\">\n <label>{{localize \"DICESONICE.sfxOptionsMuteSound\"}}</label>\n <div class=\"form-fields\">\n <input type=\"checkbox\" name=\"sfxLine[{{id}}][options][muteSound]\" data-dtype=\"Boolean\" ${disabled} {{checked muteSound}} />\n </div>\n </div>`;\n\n dialogContent.data = {\n isGlobal : sfxLine.options ? sfxLine.options.isGlobal:false,\n muteSound : sfxLine.options ? sfxLine.options.muteSound:false,\n id:id\n };\n\n return dialogContent;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\n\nexport class PlaySoundEpicFail extends DiceSFX {\n static id = \"PlaySoundEpicFail\";\n static specialEffectName = \"DICESONICE.PlaySoundEpicFail\";\n static path = 'modules/dice-so-nice/sfx/sounds/epic_fail.mp3';\n /**@override init */\n static async init(){\n game.audio.pending.push(function(){\n AudioHelper.preloadSound(PlaySoundEpicFail.path);\n }.bind(this));\n return true;\n }\n\n /**@override play */\n async play(){\n AudioHelper.play({\n src: PlaySoundEpicFail.path,\n volume: this.volume\n\t\t}, false);\n }\n}","import { DiceSFX } from '../DiceSFX.js';\n\nexport class PlaySoundEpicWin extends DiceSFX {\n static id = \"PlaySoundEpicWin\";\n static specialEffectName = \"DICESONICE.PlaySoundEpicWin\";\n static path = 'modules/dice-so-nice/sfx/sounds/epic_win.mp3';\n /**@override init */\n static async init(){\n game.audio.pending.push(function(){\n AudioHelper.preloadSound(PlaySoundEpicWin.path);\n }.bind(this));\n return true;\n }\n\n /**@override play */\n async play(){\n AudioHelper.play({\n src: PlaySoundEpicWin.path,\n volume: this.volume\n\t\t}, false);\n }\n}","/*!\n * three.proton v0.2.0\n * https://github.com/drawcall/three.proton\n *\n * Copyright 2011-2020, ajiemath\n * Licensed under the MIT license\n * http://www.opensource.org/licenses/mit-license\n *\n */\nimport * as THREE from 'three';\n //the max particle number in pool\n Proton.POOL_MAX = 500;\n Proton.TIME_STEP = 60;\n Proton.PI = 3.142;\n Proton.DR = Proton.PI / 180;\n\n //1:100\n Proton.MEASURE = 100;\n Proton.EULER = 'euler';\n Proton.RK2 = 'runge-kutta2';\n Proton.RK4 = 'runge-kutta4';\n Proton.VERLET = 'verlet';\n\n Proton.PARTICLE_CREATED = 'partilcleCreated';\n Proton.PARTICLE_UPDATE = 'partilcleUpdate';\n Proton.PARTICLE_SLEEP = 'particleSleep';\n Proton.PARTICLE_DEAD = 'partilcleDead';\n Proton.PROTON_UPDATE = 'protonUpdate';\n Proton.PROTON_UPDATE_AFTER = 'protonUpdateAfter';\n Proton.EMITTER_ADDED = 'emitterAdded';\n Proton.EMITTER_REMOVED = 'emitterRemoved';\n\n Proton.bindEmtterEvent = false;\n\n /**\n * @name Proton is a particle engine for three.js\n *\n * @class Proton\n * @param {number} preParticles input any number\n * @param {number} integrationType input any number\n * @example var proton = new Proton(200);\n */\n\n function Proton(preParticles, integrationType) {\n this.preParticles = Proton.Util.initValue(preParticles, Proton.POOL_MAX);\n this.integrationType = Proton.Util.initValue(integrationType, Proton.EULER);\n\n this.emitters = [];\n this.renderers = [];\n\n this.pool = new Proton.Pool();\n Proton.integrator = new Proton.Integration(this.integrationType);\n }\n\n\n Proton.prototype = {\n /**\n * @name add a type of Renderer\n *\n * @method addRender\n * @param {Renderer} render\n */\n addRender: function(renderer) {\n this.renderers.push(renderer);\n renderer.init(this);\n },\n\n /**\n * @name add a type of Renderer\n *\n * @method addRender\n * @param {Renderer} render\n */\n removeRender: function(renderer) {\n this.renderers.splice(this.renderers.indexOf(renderer), 1);\n renderer.remove(this);\n },\n\n /**\n * add the Emitter\n *\n * @method addEmitter\n * @param {Emitter} emitter\n */\n addEmitter: function(emitter) {\n this.emitters.push(emitter);\n emitter.parent = this;\n this.dispatchEvent(\"EMITTER_ADDED\", emitter);\n },\n\n removeEmitter: function(emitter) {\n if (emitter.parent != this) return;\n\n this.emitters.splice(this.emitters.indexOf(emitter), 1);\n emitter.parent = null;\n this.dispatchEvent(\"EMITTER_REMOVED\", emitter);\n },\n\n update: function($delta) {\n this.dispatchEvent(\"PROTON_UPDATE\", this);\n\n var delta = $delta || 0.0167;\n if (delta > 0) {\n var i = this.emitters.length;\n while (i--) this.emitters[i].update(delta);\n }\n\n this.dispatchEvent(\"PROTON_UPDATE_AFTER\", this);\n },\n\n /**\n * getCount\n * @name get the count of particle\n * @return (number) particles count\n */\n getCount: function() {\n var total = 0;\n var i, length = this.emitters.length;\n for (i = 0; i < length; i++) total += this.emitters[i].particles.length;\n return total;\n },\n\n /**\n * destroy\n * @name destroy the proton\n */\n destroy: function() {\n var i = this.emitters.length;\n\n while(i--){\n this.emitters[i].destroy();\n }\n\n this.emitters.length = 0;\n this.pool.destroy();\n }\n };\n\n \n\n\n/*\n * EventDispatcher\n * Visit http://createjs.com/ for documentation, updates and examples.\n *\n **/\n\n\n function EventDispatcher() {\n this.initialize();\n };\n\n EventDispatcher.initialize = function(target) {\n target.addEventListener = p.addEventListener;\n target.removeEventListener = p.removeEventListener;\n target.removeAllEventListeners = p.removeAllEventListeners;\n target.hasEventListener = p.hasEventListener;\n target.dispatchEvent = p.dispatchEvent;\n };\n\n var p = EventDispatcher.prototype;\n\n p._listeners = null;\n\n p.initialize = function() {};\n p.addEventListener = function(type, listener) {\n if (!this._listeners) {\n this._listeners = {};\n } else {\n this.removeEventListener(type, listener);\n }\n\n if (!this._listeners[type]) this._listeners[type] = []\n this._listeners[type].push(listener);\n\n return listener;\n };\n\n p.removeEventListener = function(type, listener) {\n if (!this._listeners) return;\n if (!this._listeners[type]) return;\n\n var arr = this._listeners[type];\n for (var i = 0, l = arr.length; i < l; i++) {\n if (arr[i] == listener) {\n if (l == 1) {\n delete(this._listeners[type]);\n }\n // allows for faster checks.\n else {\n arr.splice(i, 1);\n }\n break;\n }\n }\n };\n\n p.removeAllEventListeners = function(type) {\n if (!type)\n this._listeners = null;\n else if (this._listeners)\n delete(this._listeners[type]);\n };\n\n p.dispatchEvent = function(eventName, eventTarget) {\n var ret = false,\n listeners = this._listeners;\n\n if (eventName && listeners) {\n var arr = listeners[eventName];\n if (!arr) return ret;\n\n arr = arr.slice();\n // to avoid issues with items being removed or added during the dispatch\n\n var handler, i = arr.length;\n while (i--) {\n var handler = arr[i];\n ret = ret || handler(eventTarget);\n }\n \n }\n\n return !!ret;\n };\n\n p.hasEventListener = function(type) {\n var listeners = this._listeners;\n return !!(listeners && listeners[type]);\n };\n\n EventDispatcher.initialize(Proton.prototype);\n Proton.EventDispatcher = EventDispatcher;\n\n\n\n var Util = Util || {\n initValue: function(value, defaults) {\n var value = (value != null && value != undefined) ? value : defaults;\n return value;\n },\n\n isArray: function(value) {\n return Object.prototype.toString.call(value) === '[object Array]';\n },\n\n destroyArray: function(array) {\n array.length = 0;\n },\n\n destroyObject: function(obj) {\n for (var o in obj) delete obj[o];\n },\n\n isUndefined: function() {\n for (var id in arguments) {\n var arg = arguments[id];\n if (arg !== undefined)\n return false;\n }\n\n return true;\n },\n\n setVectorByObj: function(target, pOBJ) {\n if (pOBJ[\"x\"] !== undefined) target.p.x = pOBJ[\"x\"];\n if (pOBJ[\"y\"] !== undefined) target.p.y = pOBJ[\"y\"];\n if (pOBJ[\"z\"] !== undefined) target.p.z = pOBJ[\"z\"];\n\n if (pOBJ[\"vx\"] !== undefined) target.v.x = pOBJ[\"vx\"];\n if (pOBJ[\"vy\"] !== undefined) target.v.y = pOBJ[\"vy\"];\n if (pOBJ[\"vz\"] !== undefined) target.v.z = pOBJ[\"vz\"];\n\n if (pOBJ[\"ax\"] !== undefined) target.a.x = pOBJ[\"ax\"];\n if (pOBJ[\"ay\"] !== undefined) target.a.y = pOBJ[\"ay\"];\n if (pOBJ[\"az\"] !== undefined) target.a.z = pOBJ[\"az\"];\n\n if (pOBJ[\"p\"] !== undefined) target.p.copy(pOBJ[\"p\"]);\n if (pOBJ[\"v\"] !== undefined) target.v.copy(pOBJ[\"v\"]);\n if (pOBJ[\"a\"] !== undefined) target.a.copy(pOBJ[\"a\"]);\n\n if (pOBJ[\"position\"] !== undefined) target.p.copy(pOBJ[\"position\"]);\n if (pOBJ[\"velocity\"] !== undefined) target.v.copy(pOBJ[\"velocity\"]);\n if (pOBJ[\"accelerate\"] !== undefined) target.a.copy(pOBJ[\"accelerate\"]);\n },\n\n //set prototype\n setPrototypeByObj: function(target, proObj, filters) {\n for (var key in proObj) {\n if (target.hasOwnProperty(key)) {\n if (filters) {\n if (filters.indexOf(key) < 0) target[key] = Util._getValue(proObj[key]);\n } else {\n target[key] = Util._getValue(proObj[key]);\n }\n }\n }\n\n return target;\n },\n\n _getValue: function(pan) {\n if (pan instanceof Span)\n return pan.getValue();\n else\n return pan;\n },\n\n inherits: function(subClass, superClass) {\n subClass._super_ = superClass;\n if (Object['create']) {\n subClass.prototype = Object.create(superClass.prototype, {\n constructor: { value: subClass }\n });\n } else {\n var F = function() {};\n F.prototype = superClass.prototype;\n subClass.prototype = new F();\n subClass.prototype.constructor = subClass;\n }\n }\n };\n\n Proton.Util = Util;\n\n\n\n var ColorUtil = ColorUtil || {\n getRGB: function(color) {\n var rgb = {};\n if (typeof color === 'number') {\n hex = Math.floor(color);\n rgb.r = (color >> 16 & 255) / 255;\n rgb.g = (color >> 8 & 255) / 255;\n rgb.b = (color & 255) / 255;\n } else if (typeof color === 'string') {\n var m;\n if (m = /^(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec(color)) {\n rgb.r = Math.min(255, parseInt(m[1], 10)) / 255;\n rgb.g = Math.min(255, parseInt(m[2], 10)) / 255;\n rgb.b = Math.min(255, parseInt(m[3], 10)) / 255;\n } else if (m = /^\\#([A-Fa-f0-9]+)$/.exec(color)) {\n var hex = m[1];\n rgb.r = parseInt(hex.charAt(0) + hex.charAt(1), 16) / 255;\n rgb.g = parseInt(hex.charAt(2) + hex.charAt(3), 16) / 255;\n rgb.b = parseInt(hex.charAt(4) + hex.charAt(5), 16) / 255;\n }\n } else if (color instanceof THREE.Color) {\n rgb.r = color.r;\n rgb.g = color.g;\n rgb.b = color.b;\n }\n\n return rgb;\n }\n };\n\n\n Proton.ColorUtil = ColorUtil;\n\n\n\n var THREEUtil = {\n toScreenPos: function() {\n var vector = new THREE.Vector3();\n\n return function(pos, camera, canvas) {\n vector.copy(pos);\n // map to normalized device coordinate (NDC) space\n vector.project(camera);\n // map to 2D screen space\n vector.x = Math.round((vector.x + 1) * canvas.width / 2);\n vector.y = Math.round((-vector.y + 1) * canvas.height / 2);\n vector.z = 0;\n\n return vector;\n }\n }(),\n\n toSpacePos: function() {\n var vector = new THREE.Vector3(),\n dir = new THREE.Vector3(),\n distance;\n\n return function(pos, camera, canvas) {\n vector.set((pos.x / canvas.width) * 2 - 1, -(pos.y / canvas.height) * 2 + 1, 0.5);\n vector.unproject(camera);\n\n dir.copy(vector.sub(camera.position).normalize());\n distance = -camera.position.z / dir.z;\n vector.copy(camera.position);\n vector.add(dir.multiplyScalar(distance));\n\n return vector;\n }\n }(),\n\n getTexture: function() {\n var store = {};\n\n return function(img) {\n if (img instanceof THREE.Texture) {\n return img;\n } else if (typeof img == \"string\") {\n var id = Proton.PUID.hash(img);\n if (!store[id]) store[id] = new THREE.Texture(img);;\n return store[id];\n } else if (img instanceof Image) {\n var id = Proton.PUID.hash(img.src);\n if (!store[id]) store[id] = new THREE.Texture(img);;\n return store[id];\n }\n }\n }()\n };\n\n Proton.THREEUtil = THREEUtil;\n\n\n\n var PUID = PUID || {\n _id: 0,\n _uids: {},\n id: function(obj) {\n for (var id in this._uids) {\n if (this._uids[id] == obj) return id;\n }\n\n var nid = \"PUID_\" + (this._id++);\n this._uids[nid] = obj;\n return nid;\n },\n\n hash: function(str) {\n return;\n }\n }\n\n Proton.PUID = PUID;\n\n\n\n\n Particle.ID = 0;\n\n /**\n * the Particle class\n * @param {Number} pObj - the parameters of particle config;\n * @example \n * var p = new Proton.Particle({life:3,dead:false});\n * or\n * var p = new Proton.Particle({mass:1,radius:100});\n * @constructor\n */\n function Particle(pOBJ) {\n /**\n * @property {Number} id - The particle's id\n */\n this.id = 'particle_' + Particle.ID++;\n this.name = 'Particle';\n this.reset(\"init\");\n Proton.Util.setPrototypeByObj(this, pOBJ);\n }\n\n Particle.prototype = {\n getDirection: function() {\n return Math.atan2(this.v.x, -this.v.y) * (180 / Proton.PI);\n },\n\n /**\n * @property {Number} life - The particle's life\n * @property {Number} age - The particle's age\n * @property {Number} energy - The particle's energy loss\n * @property {Boolean} dead - The particle is dead?\n * @property {Boolean} sleep - The particle is sleep?\n * @property {Object} target - The particle's target\n * @property {Object} body - The particle's body\n * @property {Number} mass - The particle's mass\n * @property {Number} radius - The particle's radius\n * @property {Number} alpha - The particle's alpha\n * @property {Number} scale - The particle's scale\n * @property {Number} rotation - The particle's rotation\n * @property {String|Number} color - The particle's color\n * @property {Function} easing - The particle's easing\n * @property {Proton.Vector3D} p - The particle's position\n * @property {Proton.Vector3D} v - The particle's velocity\n * @property {Proton.Vector3D} a - The particle's acceleration\n * @property {Array} behaviours - The particle's behaviours array\n * @property {Object} transform - The particle's transform collection\n */\n reset: function(init) {\n this.life = Infinity;\n this.age = 0;\n //energy loss\n this.energy = 1;\n this.dead = false;\n this.sleep = false;\n this.body = null;\n this.parent = null;\n this.mass = 1;\n this.radius = 10;\n\n this.alpha = 1;\n this.scale = 1;\n\n this.useColor = false;\n this.useAlpha = false;\n\n this.easing = Proton.ease.setEasingByName(Proton.ease.easeLinear);\n\n if (init) {\n this.p = new Proton.Vector3D();\n this.v = new Proton.Vector3D();\n this.a = new Proton.Vector3D();\n this.old = {};\n this.old.p = this.p.clone();\n this.old.v = this.v.clone();\n this.old.a = this.a.clone();\n\n this.behaviours = [];\n this.transform = {};\n this.color = { r: 0, g: 0, b: 0 };\n this.rotation = new Proton.Vector3D;\n } else {\n this.p.set(0, 0, 0);\n this.v.set(0, 0, 0);\n this.a.set(0, 0, 0);\n this.old.p.set(0, 0, 0);\n this.old.v.set(0, 0, 0);\n this.old.a.set(0, 0, 0);\n\n this.color.r = 0;\n this.color.g = 0;\n this.color.b = 0;\n\n this.rotation.clear();\n\n Proton.Util.destroyObject(this.transform);\n this.removeAllBehaviours();\n }\n\n return this;\n },\n\n update: function(time, index) {\n if (!this.sleep) {\n this.age += time;\n\n var i = this.behaviours.length;\n while (i--) {\n this.behaviours[i] && this.behaviours[i].applyBehaviour(this, time, index)\n }\n } else {\n //sleep\n }\n\n if (this.age >= this.life) {\n this.destroy();\n } else {\n var scale = this.easing(this.age / this.life);\n this.energy = Math.max(1 - scale, 0);\n }\n\n },\n\n addBehaviour: function(behaviour) {\n this.behaviours.push(behaviour);\n behaviour.initialize(this);\n },\n\n addBehaviours: function(behaviours) {\n var i = behaviours.length;\n while (i--) {\n this.addBehaviour(behaviours[i]);\n }\n },\n\n removeBehaviour: function(behaviour) {\n var index = this.behaviours.indexOf(behaviour);\n if (index > -1) {\n this.behaviours.splice(index, 1);\n }\n },\n\n removeAllBehaviours: function() {\n Proton.Util.destroyArray(this.behaviours);\n },\n\n /**\n * Destory this particle\n * @method destroy\n */\n destroy: function() {\n this.removeAllBehaviours();\n this.energy = 0;\n this.dead = true;\n this.parent = null;\n }\n };\n\n Proton.Particle = Particle;\n\n\n\n\n function Pool() {\n this.cID = 0;\n this.list = {};\n }\n\n Pool.prototype = {\n create: function(obj) {\n this.cID++;\n\n if (typeof obj == \"function\")\n return new obj;\n else\n return obj.clone();\n },\n\n getCount: function() {\n var count = 0;\n for (var id in this.list)\n count += this.list[id].length;\n\n return count++;;\n },\n\n get: function(obj) {\n var p, puid = obj.__puid || Proton.PUID.id(obj);\n if (this.list[puid] && this.list[puid].length > 0)\n p = this.list[puid].pop();\n else\n p = this.create(obj);\n\n p.__puid = obj.__puid || puid;\n return p;\n },\n\n expire: function(obj) {\n return this._getList(obj.__puid).push(obj);\n },\n\n destroy: function() {\n for (var id in this.list) {\n this.list[id].length = 0;\n delete this.list[id];\n }\n },\n\n _getList: function(uid) {\n uid = uid || \"default\";\n if (!this.list[uid]) this.list[uid] = [];\n return this.list[uid];\n }\n }\n\n Proton.Pool = Pool;\n\n\n\n\n var MathUtils = {\n randomAToB: function(a, b, INT) {\n if (!INT)\n return a + Math.random() * (b - a);\n else\n return ((Math.random() * (b - a)) >> 0) + a;\n },\n randomFloating: function(center, f, INT) {\n return MathUtils.randomAToB(center - f, center + f, INT);\n },\n\n randomZone: function(display) {\n\n },\n\n degreeTransform: function(a) {\n return a * Proton.PI / 180;\n },\n\n toColor16: function getRGB(num) {\n return \"#\" + num.toString(16);\n },\n\n randomColor: function() {\n return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).slice(-6);\n },\n\n lerp: function(a, b, energy) {\n return b + (a - b) * energy\n },\n\n getNormal: function(v, n) {\n if (v.x == 0 && v.y == 0) {\n if (v.z == 0)\n n.set(1, 0, 1);\n else\n n.set(1, 1, -v.y / v.z);\n } else {\n if (v.x == 0)\n n.set(1, 0, 1);\n else\n n.set(-v.y / v.x, 1, 1);\n }\n\n return n.normalize();\n },\n\n /** \n * Rodrigues' Rotation Formula \n * https://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula\n * v′ = vcos(θ) + k(k⋅v)(1−cos(θ)) + (k*v)sin(θ)\n */\n axisRotate: function(v0, v, k, tha) {\n var cos = Math.cos(tha);\n var sin = Math.sin(tha);\n var p = k.dot(v) * (1 - cos);\n\n v0.copy(k);\n v0.cross(v).scalar(sin);\n v0.addValue(v.x * cos, v.y * cos, v.z * cos);\n v0.addValue(k.x * p, k.y * p, k.z * p);\n }\n }\n\n Proton.MathUtils = MathUtils;\n\n\n//数值积分\n\n var Integration = function(type) {\n this.type = Proton.Util.initValue(type, Proton.EULER);\n }\n\n Integration.prototype = {\n integrate: function(particles, time, damping) {\n this.euler(particles, time, damping);\n },\n\n euler: function(particle, time, damping) {\n if (!particle.sleep) {\n particle.old.p.copy(particle.p);\n particle.old.v.copy(particle.v);\n particle.a.scalar(1 / particle.mass);\n particle.v.add(particle.a.scalar(time));\n particle.p.add(particle.old.v.scalar(time));\n damping && particle.v.scalar(damping);\n particle.a.clear();\n }\n }\n }\n\n Proton.Integration = Integration;\n\n\n//@author mrdoob / http://mrdoob.com/\n\n var Vector3D = function(x, y, z) {\n this.x = x || 0;\n this.y = y || 0;\n this.z = z || 0;\n }\n\n Vector3D.prototype = {\n set: function(x, y, z) {\n this.x = x;\n this.y = y;\n this.z = z;\n return this;\n },\n\n setX: function(x) {\n this.x = x;\n return this;\n },\n\n setY: function(y) {\n this.y = y;\n return this;\n },\n\n setZ: function(z) {\n this.z = z;\n return this;\n },\n\n getGradient: function() {\n if (this.x != 0)\n return Math.atan2(this.y, this.x);\n else if (this.y > 0)\n return Proton.PI / 2;\n else if (this.y < 0)\n return -Proton.PI / 2;\n },\n\n copy: function(v) {\n this.x = v.x;\n this.y = v.y;\n this.z = v.z;\n return this;\n },\n\n add: function(v, w) {\n if (w !== undefined) return this.addVectors(v, w);\n\n this.x += v.x;\n this.y += v.y;\n this.z += v.z;\n\n return this;\n\n },\n\n addValue: function(a, b, c) {\n this.x += a;\n this.y += b;\n this.z += c;\n\n return this;\n\n },\n\n addVectors: function(a, b) {\n this.x = a.x + b.x;\n this.y = a.y + b.y;\n this.z = a.z + b.z;\n\n return this;\n },\n\n addScalar: function(s) {\n this.x += s;\n this.y += s;\n this.z += s;\n\n return this;\n },\n\n sub: function(v, w) {\n if (w !== undefined) return this.subVectors(v, w);\n\n this.x -= v.x;\n this.y -= v.y;\n this.z -= v.z;\n\n return this;\n },\n\n subVectors: function(a, b) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n this.z = a.z - b.z;\n return this;\n },\n\n scalar: function(s) {\n this.x *= s;\n this.y *= s;\n this.z *= s;\n\n return this;\n },\n\n divideScalar: function(s) {\n if (s !== 0) {\n this.x /= s;\n this.y /= s;\n this.z /= s;\n } else {\n this.set(0, 0, 0);\n }\n\n return this;\n },\n\n negate: function() {\n return this.scalar(-1);\n },\n\n dot: function(v) {\n return this.x * v.x + this.y * v.y + this.z * v.z;\n },\n\n cross: function(v) {\n var x = this.x,\n y = this.y,\n z = this.z;\n\n this.x = y * v.z - z * v.y;\n this.y = z * v.x - x * v.z;\n this.z = x * v.y - y * v.x;\n\n return this;\n },\n\n lengthSq: function() {\n return this.x * this.x + this.y * this.y + this.z * this.z;\n },\n\n length: function() {\n return Math.sqrt(this.lengthSq());\n },\n\n normalize: function() {\n return this.divideScalar(this.length());\n },\n\n distanceTo: function(v) {\n return Math.sqrt(this.distanceToSquared(v));\n },\n\n crossVectors: function(a, b) {\n\n var ax = a.x,\n ay = a.y,\n az = a.z;\n var bx = b.x,\n by = b.y,\n bz = b.z;\n\n this.x = ay * bz - az * by;\n this.y = az * bx - ax * bz;\n this.z = ax * by - ay * bx;\n\n return this;\n\n },\n\n // eulerFromDir: function() {\n // var quaternion, dir, up;\n\n // return function rotateFromDir(direction) {\n // if (quaternion === undefined) quaternion = new Proton.Quaternion();\n // if (dir === undefined) dir = new Proton.Vector3D;\n // if (up === undefined) up = new Proton.Vector3D(0, 0, 1);\n\n // //quaternion.setFromUnitVectors(up, dir.copy(direction).normalize());\n // console.log(quaternion.setFromUnitVectors(up, dir.copy(direction).normalize()));\n\n // this.applyQuaternion(quaternion.setFromUnitVectors(up, dir.copy(direction).normalize()));\n // console.log(this);\n // return this;\n // };\n // }(),\n\n eulerFromDir: function(dir) {\n \n },\n\n applyEuler: function() {\n var quaternion;\n\n return function applyEuler(euler) {\n if (quaternion === undefined) quaternion = new Proton.Quaternion();\n this.applyQuaternion(quaternion.setFromEuler(euler));\n return this;\n };\n }(),\n\n applyAxisAngle: function() {\n var quaternion;\n return function applyAxisAngle(axis, angle) {\n if (quaternion === undefined) quaternion = new Proton.Quaternion();\n this.applyQuaternion(quaternion.setFromAxisAngle(axis, angle));\n return this;\n };\n }(),\n\n applyQuaternion: function(q) {\n var x = this.x;\n var y = this.y;\n var z = this.z;\n\n var qx = q.x;\n var qy = q.y;\n var qz = q.z;\n var qw = q.w;\n\n // calculate quat * vector\n\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = -qx * x - qy * y - qz * z;\n\n // calculate result * inverse quat\n this.x = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n this.y = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n this.z = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n return this;\n },\n\n distanceToSquared: function(v) {\n var dx = this.x - v.x,\n dy = this.y - v.y,\n dz = this.z - v.z;\n\n return dx * dx + dy * dy + dz * dz;\n },\n\n lerp: function(v, alpha) {\n this.x += (v.x - this.x) * alpha;\n this.y += (v.y - this.y) * alpha;\n this.z += (v.z - this.z) * alpha;\n return this;\n },\n\n equals: function(v) {\n return ((v.x === this.x) && (v.y === this.y) && (v.z === this.z));\n },\n\n clear: function() {\n this.x = 0.0;\n this.y = 0.0;\n this.z = 0.0;\n return this;\n },\n\n clone: function() {\n return new Proton.Vector3D(this.x, this.y, this.z);\n },\n\n toString: function() {\n return \"x:\" + this.x + \"y:\" + this.y + \"z:\" + this.z;\n }\n };\n\n Proton.Vector3D = Vector3D;\n\n\n\n var Polar3D = function(radius, theta, phi) {\n this.radius = radius || 1;\n this.phi = phi || 0;\n this.theta = theta || 0;\n }\n\n Polar3D.prototype = {\n set: function(radius, theta, phi) {\n this.radius = radius || 1;\n this.phi = phi || 0;\n this.theta = theta || 0;\n\n return this;\n },\n\n setRadius: function(radius) {\n this.radius = radius;\n return this;\n },\n\n setPhi: function(phi) {\n this.phi = phi;\n return this;\n },\n\n setTheta: function(theta) {\n this.theta = theta;\n return this;\n },\n\n copy: function(p) {\n this.radius = p.radius;\n this.phi = p.phi;\n this.theta = p.theta;\n return this;\n },\n\n toVector3D: function() {\n return new Proton.Vector3D(this.getX(), this.getY(), this.getZ());\n },\n\n getX: function() {\n return this.radius * Math.sin(this.theta) * Math.cos(this.phi);\n },\n\n getY: function() {\n return -this.radius * Math.sin(this.theta) * Math.sin(this.phi);\n },\n\n getZ: function() {\n return this.radius * Math.cos(this.theta);\n },\n\n normalize: function() {\n this.radius = 1;\n return this;\n },\n\n equals: function(v) {\n return ((v.radius === this.radius) && (v.phi === this.phi) && (v.theta === this.theta));\n },\n\n clear: function() {\n this.radius = 0.0;\n this.phi = 0.0;\n this.theta = 0.0;\n return this;\n },\n\n clone: function() {\n return new Polar3D(this.radius, this.phi, this.theta);\n }\n };\n\n\n Proton.Polar3D = Polar3D;\n\n\n\n /**\n * Span Class. Get a random Number from a to b. Or from c-a to c+b\n * @param {Number|Array} a - min number\n * @param {Number} b - max number\n * @param {Number} center - the center's z value \n * @example \n * var span = new Proton.Span(0,30);\n * or\n * var span = new Proton.Span([\"#fff\",\"#ff0\",\"#000\"]);\n * or\n * var span = new Proton.Span(5,1,\"center\");\n * @extends {Zone}\n * @constructor\n */\n function Span(a, b, center) {\n this._isArray = false;\n\n if (Proton.Util.isArray(a)) {\n this._isArray = true;\n this.a = a;\n } else {\n this.a = Proton.Util.initValue(a, 1);\n this.b = Proton.Util.initValue(b, this.a);\n this._center = Proton.Util.initValue(center, false);\n }\n }\n\n /**\n * Span.getValue function\n * @name get a random Number from a to b. Or get a random Number from c-a to c+b\n * @param {number} INT or int\n * @return {number} a random Number\n */\n Span.prototype = {\n getValue: function(INT) {\n if (this._isArray) {\n return this.a[(this.a.length * Math.random()) >> 0];\n } else {\n if (!this._center)\n return Proton.MathUtils.randomAToB(this.a, this.b, INT);\n else\n return Proton.MathUtils.randomFloating(this.a, this.b, INT);\n }\n }\n }\n\n /**\n * Proton.createSpan function\n * @name get a instance of Span\n * @param {number} a min number\n * @param {number} b max number\n * @param {number} c center number\n * @return {number} return a instance of Span\n */\n Proton.createSpan = function(a, b, c) {\n if (a instanceof Span) return a;\n\n if (b === undefined) {\n return new Span(a);\n } else {\n if (c === undefined)\n return new Span(a, b);\n else\n return new Span(a, b, c);\n }\n }\n\n Proton.Span = Span;\n\n\n\n /**\n * ArraySpan name get a random Color from a colors array\n * @param {String|Array} colors - colors array\n * @example \n * var span = new Proton.ArraySpan([\"#fff\",\"#ff0\",\"#000\"]);\n * or\n * var span = new Proton.ArraySpan(\"#ff0\");\n * @extends {Proton.Span}\n * @constructor\n */\n\n function ArraySpan(colors) {\n this._arr = Proton.Util.isArray(colors) ? colors : [colors];\n }\n\n Proton.Util.inherits(ArraySpan, Proton.Span);\n\n /**\n * getValue function\n * @name get a random Color\n * @return {string} a hex color\n */\n ArraySpan.prototype.getValue = function() {\n var color = this._arr[(this._arr.length * Math.random()) >> 0];\n \n if (color == 'random' || color == 'Random')\n return Proton.MathUtils.randomColor();\n else\n return color;\n }\n\n /**\n * Proton.createArraySpan function\n * @name get a instance of Span\n * @param {number} a min number\n * @param {number} b max number\n * @param {number} c center number\n * @return {number} return a instance of Span\n */\n Proton.createArraySpan = function(arr) {\n if (!arr) return null;\n if (arr instanceof Proton.ArraySpan)\n return arr;\n else \n return new Proton.ArraySpan(arr);\n }\n\n Proton.ArraySpan = ArraySpan;\n\n\n\n\n\n var Quaternion = function(x, y, z, w) {\n this.x = x || 0;\n this.y = y || 0;\n this.z = z || 0;\n this.w = (w !== undefined) ? w : 1;\n };\n\n Quaternion.prototype = {\n set: function(x, y, z, w) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n return this;\n },\n\n clone: function() {\n return new Proton.Quaternion(this.x, this.y, this.z, this.w);\n },\n\n copy: function(quaternion) {\n this.x = quaternion.x;\n this.y = quaternion.y;\n this.z = quaternion.z;\n this.w = quaternion.w;\n return this;\n },\n\n setFromEuler: function(euler) {\n // http://www.mathworks.com/matlabcentral/fileexchange/\n // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n // content/SpinCalc.m\n\n var c1 = Math.cos(euler.x / 2);\n var c2 = Math.cos(euler.y / 2);\n var c3 = Math.cos(euler.z / 2);\n var s1 = Math.sin(euler.x / 2);\n var s2 = Math.sin(euler.y / 2);\n var s3 = Math.sin(euler.z / 2);\n\n this.x = s1 * c2 * c3 + c1 * s2 * s3;\n this.y = c1 * s2 * c3 - s1 * c2 * s3;\n this.z = c1 * c2 * s3 + s1 * s2 * c3;\n this.w = c1 * c2 * c3 - s1 * s2 * s3;\n\n return this;\n\n },\n\n setFromAxisAngle: function(axis, angle) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n // assumes axis is normalized\n var halfAngle = angle / 2,\n s = Math.sin(halfAngle);\n this.x = axis.x * s;\n this.y = axis.y * s;\n this.z = axis.z * s;\n this.w = Math.cos(halfAngle);\n\n return this;\n },\n\n // setFromUnitVectors: function() {\n // var v1, r;\n // var EPS = 0.000001;\n\n // return function(vFrom, vTo) {\n // if (v1 === undefined) v1 = new Proton.Vector3D();\n\n // r = vFrom.dot(vTo) + 1;\n // if (r < EPS) {\n // r = 0;\n // if (Math.abs(vFrom.x) > Math.abs(vFrom.z)) {\n // v1.set(-vFrom.y, vFrom.x, 0);\n // } else {\n // v1.set(0, -vFrom.z, vFrom.y);\n // }\n // } else {\n // v1.crossVectors(vFrom, vTo);\n // }\n\n // this.x = v1.x;\n // this.y = v1.y;\n // this.z = v1.z;\n // this.w = r;\n // return this.normalize();\n // };\n // }(),\n\n normalize: function() {\n\n var l = this.length();\n\n if (l === 0) {\n\n this.x = 0;\n this.y = 0;\n this.z = 0;\n this.w = 1;\n\n } else {\n l = 1 / l;\n this.x *= l;\n this.y *= l;\n this.z *= l;\n this.w *= l;\n\n }\n return this;\n },\n\n length: function() {\n\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);\n\n },\n\n dot: function(v) {\n return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n }\n };\n\n Proton.Quaternion = Quaternion;\n\n\n\n function Box(x, y, z, w, h, d) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.width = w;\n this.height = h;\n this.depth = d;\n this.bottom = this.y + this.height;\n this.right = this.x + this.width;\n this.right = this.x + this.width;\n }\n\n\n Box.prototype = {\n contains: function(x, y, z) {\n if (\n x <= this.right &&\n x >= this.x &&\n y <= this.bottom &&\n y >= this.y &&\n z <= this.depth &&\n z >= this.z\n )\n return true\n else\n return false\n }\n }\n\n Proton.Box = Box;\n\n\n\n /**\n * The Behaviour class is the base for the other Behaviour\n *\n * @class Behaviour\n * @constructor\n */\n function Behaviour(life, easing) {\n /**\n * The behaviour's id;\n * @property id\n * @type {String} id\n */\n this.id = 'Behaviour_' + Behaviour.id++;\n this.life = Proton.Util.initValue(life, Infinity);\n\n /**\n * The behaviour's decaying trend, for example Proton.easeOutQuart;\n * @property easing\n * @type {String}\n * @default Proton.easeLinear\n */\n this.easing = Proton.Util.initValue(easing, Proton.ease.setEasingByName(Proton.ease.easeLinear));\n this.age = 0;\n this.energy = 1;\n /**\n * The behaviour is Dead;\n * @property dead\n * @type {Boolean}\n */\n this.dead = false;\n\n /**\n * The behaviour name;\n * @property name\n * @type {string}\n */\n\n this.name = 'Behaviour';\n }\n\n Behaviour.id = 0;\n\n\n Behaviour.prototype = {\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @param {Number} this behaviour's life\n * @param {String} this behaviour's easing\n */\n reset: function(life, easing) {\n this.life = Proton.Util.initValue(life, Infinity);\n this.easing = Proton.Util.initValue(easing, Proton.ease.setEasingByName(Proton.ease.easeLinear));\n },\n /**\n * Normalize a force by 1:100;\n *\n * @method normalizeForce\n * @param {Proton.Vector2D} force \n */\n normalizeForce: function(force) {\n return force.scalar(Proton.MEASURE);\n },\n\n /**\n * Normalize a value by 1:100;\n *\n * @method normalizeValue\n * @param {Number} value\n */\n normalizeValue: function(value) {\n return value * Proton.MEASURE;\n },\n\n /**\n * Initialize the behaviour's parameters for all particles\n *\n * @method initialize\n * @param {Proton.Particle} particle\n */\n initialize: function(particle) {},\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour: function(particle, time, index) {\n if (this.dead) return;\n\n this.age += time;\n if (this.age >= this.life) {\n this.energy = 0;\n this.dead = true;\n return;\n }\n\n var scale = this.easing(particle.age / particle.life);\n this.energy = Math.max(1 - scale, 0);\n },\n\n /**\n * Destory this behaviour\n * @method destroy\n */\n destroy: function() {\n\n }\n };\n\n Proton.Behaviour = Behaviour;\n\n\n\n /**\n * The number of particles per second emission (a [particle]/b [s]);\n * @class Proton.Rate\n * @constructor\n * @param {Array or Number or Proton.Span} numPan the number of each emission;\n * @param {Array or Number or Proton.Span} timePan the time of each emission;\n * for example: new Proton.Rate(new Proton.Span(10, 20), new Proton.Span(.1, .25));\n */\n \n function Rate(numPan, timePan) {\n this.numPan = Proton.createSpan(Proton.Util.initValue(numPan, 1));\n this.timePan = Proton.createSpan(Proton.Util.initValue(timePan, 1));\n\n this.startTime = 0;\n this.nextTime = 0;\n this.init();\n }\n\n Rate.prototype = {\n init: function() {\n this.startTime = 0;\n this.nextTime = this.timePan.getValue();\n },\n\n getValue: function(time) {\n this.startTime += time;\n\n if (this.startTime >= this.nextTime) {\n this.init();\n\n if (this.numPan.b == 1) {\n if (this.numPan.getValue(\"Float\") > 0.5)\n return 1;\n else\n return 0;\n } else {\n return this.numPan.getValue(\"Int\");\n }\n }\n\n return 0;\n }\n }\n\n Proton.Rate = Rate;\n\n\n\n function Initialize() {\n this.name = \"Initialize\";\n }\n\n\n Initialize.prototype.reset = function() {\n\n }\n\n Initialize.prototype.init = function(emitter, particle) {\n if (particle) {\n this.initialize(particle);\n } else {\n this.initialize(emitter);\n }\n };\n\n ///sub class init\n Initialize.prototype.initialize = function(target) {};\n Proton.Initialize = Initialize;\n\n\n\n var InitializeUtil = {\n\n initialize: function(emitter, particle, initializes) {\n var i = initializes.length;\n while (i--) {\n var initialize = initializes[i];\n if (initialize instanceof Proton.Initialize)\n initialize.init(emitter, particle);\n else\n InitializeUtil.init(emitter, particle, initialize);\n }\n\n InitializeUtil.bindEmitter(emitter, particle);\n },\n\n //////////////////////init//////////////////////\n init: function(emitter, particle, initialize) {\n Proton.Util.setPrototypeByObj(particle, initialize);\n Proton.Util.setVectorByObj(particle, initialize);\n },\n\n bindEmitter: function(emitter, particle) {\n if (emitter.bindEmitter) {\n particle.p.add(emitter.p);\n particle.v.add(emitter.v);\n particle.a.add(emitter.a);\n particle.v.applyEuler(emitter.rotation);\n }\n }\n }\n\n Proton.InitializeUtil = InitializeUtil;\n\n\n\n /**\n * Life is init particle's Life\n * @param {Number} a - the Life's start point\n * @param {Number} b - the Life's end point \n * @param {String} c - span's center \n * @example \n * var life = new Proton.Life(3,5);\n * or\n * var life = new Proton.Life(Infinity);\n * @extends {Initialize}\n * @constructor\n */\n function Life(a, b, c) {\n Life._super_.call(this);\n this.lifePan = Proton.createSpan(a, b, c);\n }\n\n\n Proton.Util.inherits(Life, Proton.Initialize);\n Life.prototype.initialize = function(target) {\n if (this.lifePan.a == Infinity || this.lifePan.a == \"infi\")\n target.life = Infinity;\n else\n target.life = this.lifePan.getValue();\n };\n\n\n Proton.Life = Life;\n\n\n\n /**\n * Position is init particle's Position\n * @param {Zone} zone - the Position zone\n * @example \n * var Position = new Proton.Position(new Proton.PointZone(30,100,0));\n * or\n * var Position = new Proton.Position(Infinity);\n * @extends {Proton.Initialize}\n * @constructor\n */\n function Position() {\n Position._super_.call(this);\n this.reset.apply(this, arguments);\n }\n\n\n Proton.Util.inherits(Position, Proton.Initialize);\n Position.prototype.reset = function() {\n if (!this.zones) this.zones = [];\n else this.zones.length = 0;\n\n var args = Array.prototype.slice.call(arguments);\n this.zones = this.zones.concat(args);\n };\n\n Position.prototype.addZone = function() {\n var args = Array.prototype.slice.call(arguments);\n this.zones = this.zones.concat(args);\n };\n\n Position.prototype.initialize = function() {\n var zone;\n return function(target) {\n var zone = this.zones[(Math.random() * this.zones.length) >> 0];\n zone.getPosition();\n\n target.p.x = zone.vector.x;\n target.p.y = zone.vector.y;\n target.p.z = zone.vector.z;\n }\n }();\n\n\n Proton.Position = Position;\n Proton.P = Position;\n\n\n\n\n /**\n * Velocity is init particle's Velocity\n * @param {Number} a - the Life's start point\n * @param {Number} b - the Life's end point \n * @param {String} c - span's center \n * @example \n * var life = new Proton.Life(3,5);\n * or\n * var life = new Proton.Life(Infinity);\n * @extends {Initialize}\n * @constructor\n */\n //radius and tha\n function Velocity(a, b, c) {\n Velocity._super_.call(this);\n this.reset(a, b, c);\n this.dirVec = new Proton.Vector3D(0, 0, 0);\n\n this.name = \"Velocity\";\n }\n\n Proton.Util.inherits(Velocity, Proton.Initialize);\n\n Velocity.prototype.reset = function(a, b, c) {\n //[vector,tha]\n if (a instanceof Proton.Vector3D) {\n this.radiusPan = Proton.createSpan(1);\n this.dir = a.clone();\n this.tha = b * Proton.DR;\n this._useV = true;\n }\n\n //[polar,tha]\n else if (a instanceof Proton.Polar3D) {\n this.tha = b * Proton.DR;\n this.dirVec = a.toVector3D();\n this._useV = false;\n }\n\n //[radius,vector,tha]\n else {\n this.radiusPan = Proton.createSpan(a);\n this.dir = b.clone().normalize();\n this.tha = c * Proton.DR;\n this._useV = true;\n }\n };\n\n Velocity.prototype.normalize = function(vr) {\n return vr * Proton.MEASURE;\n }\n\n Velocity.prototype.initialize = function() {\n var tha;\n var normal = new Proton.Vector3D(0, 0, 1);\n var v = new Proton.Vector3D(0, 0, 0);\n\n return function initialize(target) {\n tha = this.tha * Math.random();\n this._useV && this.dirVec.copy(this.dir).scalar(this.radiusPan.getValue());\n\n Proton.MathUtils.getNormal(this.dirVec, normal);\n v.copy(this.dirVec).applyAxisAngle(normal, tha);\n v.applyAxisAngle(this.dirVec.normalize(), Math.random() * Proton.PI * 2);\n\n //use axisRotate methods\n //Proton.MathUtils.axisRotate(this.v1, this.dirVec, normal, tha);\n //Proton.MathUtils.axisRotate(this.v2, this.v1, this.dirVec.normalize(), Math.random() * Proton.PI * 2);\n target.v.copy(v);\n return this;\n };\n }()\n\n Proton.Velocity = Velocity;\n Proton.V = Velocity;\n\n\n\n /**\n * Mass is init particle's Mass\n * @param {Number} a - the Mass's start point\n * @param {Number} b - the Mass's end point \n * @param {String} c - span's center \n * @example \n * var Mass = new Proton.Mass(3,5);\n * or\n * var Mass = new Proton.Mass(Infinity);\n * @extends {Initialize}\n * @constructor\n */\n function Mass(a, b, c) {\n Mass._super_.call(this);\n this.massPan = Proton.createSpan(a, b, c);\n }\n\n\n Proton.Util.inherits(Mass, Proton.Initialize);\n Mass.prototype.initialize = function(target) {\n target.mass = this.massPan.getValue();\n };\n\n Proton.Mass = Mass;\n\n\n\n\n /**\n * Radius is init particle's Radius\n * @param {Number} a - the Radius's start point\n * @param {Number} b - the Radius's end point \n * @param {String} c - span's center \n * @example \n * var Radius = new Proton.Radius(3,5);\n * or\n * var Radius = new Proton.Radius(3,1,\"center\");\n * @extends {Initialize}\n * @constructor\n */\n function Radius(a, b, c) {\n Radius._super_.call(this);\n this.radius = Proton.createSpan(a, b, c);\n }\n\n\n Proton.Util.inherits(Radius, Proton.Initialize);\n Radius.prototype.reset = function(a, b, c) {\n this.radius = Proton.createSpan(a, b, c);\n };\n\n Radius.prototype.initialize = function(particle) {\n particle.radius = this.radius.getValue();\n particle.transform.oldRadius = particle.radius;\n };\n\n Proton.Radius = Radius;\n\n\n\n function Body(body, w, h) {\n Body._super_.call(this);\n this.body = Proton.createArraySpan(body);\n this.w = w;\n this.h = Proton.Util.initValue(h, this.w);\n }\n\n Proton.Util.inherits(Body, Proton.Initialize);\n\n Body.prototype.initialize = function(particle) {\n var body = this.body.getValue();\n if (!!this.w) {\n particle.body = {\n width: this.w,\n height: this.h,\n body: body\n };\n } else {\n particle.body = body;\n }\n };\n\n Proton.Body = Body;\n\n\n\n\n /**\n * The Behaviour class is the base for the other Behaviour\n *\n * @class Behaviour\n * @constructor\n */\n function Force(fx, fy, fz, life, easing) {\n Force._super_.call(this, life, easing);\n Force.prototype.reset.call(this, fx, fy, fz);\n this.name = \"Force\";\n }\n\n Proton.Util.inherits(Force, Proton.Behaviour);\n Force.prototype.reset = function(fx, fy, fz) {\n this.force = this.normalizeForce(new Proton.Vector3D(fx, fy, fz));\n this.force.id = Math.random();\n }\n\n Force.prototype.applyBehaviour = function(particle, time, index) {\n Force._super_.prototype.applyBehaviour.call(this, particle, time, index);\n particle.a.add(this.force);\n };\n\n Proton.F = Proton.Force = Force;\n\n\n\n\tfunction Attraction(targetPosition, force, radius, life, easing) {\n\t\tAttraction._super_.call(this, life, easing);\n\t\tthis.targetPosition = Proton.Util.initValue(targetPosition, new Proton.Vector3D);\n\t\tthis.radius = Proton.Util.initValue(radius, 1000);\n\t\tthis.force = Proton.Util.initValue(this.normalizeValue(force), 100);\n\t\tthis.radiusSq = this.radius * this.radius\n\t\tthis.attractionForce = new Proton.Vector3D();\n\t\tthis.lengthSq = 0;\n\t\tthis.name = \"Attraction\";\n\t}\n\n\n\tProton.Util.inherits(Attraction, Proton.Behaviour);\n\tAttraction.prototype.reset = function(targetPosition, force, radius, life, easing) {\n\t\tthis.targetPosition = Proton.Util.initValue(targetPosition, new Proton.Vector3D);\n\t\tthis.radius = Proton.Util.initValue(radius, 1000);\n\t\tthis.force = Proton.Util.initValue(this.normalizeValue(force), 100);\n\t\tthis.radiusSq = this.radius * this.radius\n\t\tthis.attractionForce = new Proton.Vector3D();\n\t\tthis.lengthSq = 0;\n\t\tif (life)\n\t\t\tAttraction._super_.prototype.reset.call(this, life, easing);\n\t}\n\n\tAttraction.prototype.applyBehaviour = function(particle, time, index) {\n\t\tAttraction._super_.prototype.applyBehaviour.call(this, particle, time, index);\n\t\tthis.attractionForce.copy(this.targetPosition);\n\t\tthis.attractionForce.sub(particle.p);\n\t\tthis.lengthSq = this.attractionForce.lengthSq();\n\t\tif (this.lengthSq > 0.000004 && this.lengthSq < this.radiusSq) {\n\t\t\tthis.attractionForce.normalize();\n\t\t\tthis.attractionForce.scalar(1 - this.lengthSq / this.radiusSq);\n\t\t\tthis.attractionForce.scalar(this.force);\n\t\t\tparticle.a.add(this.attractionForce);\n\t\t}\n\t};\n\n\tProton.Attraction = Attraction;\n\n\n\n\n /**\n * The Behaviour class is the base for the other Behaviour\n *\n * @class Behaviour\n * @constructor\n */\n function RandomDrift(driftX, driftY, driftZ, delay, life, easing) {\n RandomDrift._super_.call(this, life, easing);\n this.reset(driftX, driftY, driftZ, delay);\n this.time = 0;\n this.name = \"RandomDrift\";\n }\n\n\n Proton.Util.inherits(RandomDrift, Proton.Behaviour);\n RandomDrift.prototype.reset = function(driftX, driftY, driftZ, delay, life, easing) {\n this.randomFoce = this.normalizeForce(new Proton.Vector3D(driftX, driftY, driftZ));\n this.delayPan = Proton.createSpan(delay || .03);\n this.time = 0;\n life && RandomDrift._super_.prototype.reset.call(this, life, easing);\n }\n\n RandomDrift.prototype.applyBehaviour = function(particle, time, index) {\n RandomDrift._super_.prototype.applyBehaviour.call(this, particle, time, index);\n\n this.time += time;\n if (this.time >= this.delayPan.getValue()) {\n var ax = Proton.MathUtils.randomAToB(-this.randomFoce.x, this.randomFoce.x);\n var ay = Proton.MathUtils.randomAToB(-this.randomFoce.y, this.randomFoce.y);\n var az = Proton.MathUtils.randomAToB(-this.randomFoce.z, this.randomFoce.z);\n particle.a.addValue(ax, ay, az);\n this.time = 0;\n };\n };\n\n Proton.RandomDrift = RandomDrift;\n\n\n\n\tfunction Repulsion(targetPosition, force, radius, life, easing) {\n\t\tRepulsion._super_.call(this, targetPosition, force, radius, life, easing);\n\t\tthis.force *= -1;\n\t\tthis.name = \"Repulsion\";\n\t}\n\n\n\tProton.Util.inherits(Repulsion, Proton.Attraction);\n\tRepulsion.prototype.reset = function(targetPosition, force, radius, life, easing) {\n\t\tRepulsion._super_.prototype.reset.call(this, targetPosition, force, radius, life, easing);\n\t\tthis.force *= -1;\n\t}\n\tProton.Repulsion = Repulsion;\n\n\n\n\n function Gravity(g, life, easing) {\n Gravity._super_.call(this, 0, -g, 0, life, easing);\n this.name = \"Gravity\";\n }\n\n Proton.Util.inherits(Gravity, Proton.Force);\n\n Gravity.prototype.reset = function(g, life, easing) {\n Gravity._super_.prototype.reset.call(this, 0, -g, 0, life, easing);\n }\n\n Proton.Gravity = Gravity;\n Proton.G = Gravity;\n\n\n\n /**\n * The Scale class is the base for the other Proton.Behaviour\n *\n * @class Proton.Behaviour\n * @constructor\n */\n //can use Collision(emitter,true,function(){}) or Collision();\n function Collision(emitter, useMass, callback, life, easing) {\n Collision._super_.call(this, life, easing);\n this.reset(emitter, useMass, callback);\n this.name = \"Collision\";\n }\n\n Proton.Util.inherits(Collision, Proton.Behaviour);\n Collision.prototype.reset = function(emitter, useMass, callback, life, easing) {\n this.emitter = emitter;\n this.useMass = useMass;\n this.callback = callback;\n this.particles = [];\n this.delta = new Proton.Vector3D();\n life && Collision._super_.prototype.reset.call(this, life, easing);\n }\n\n Collision.prototype.applyBehaviour = function(particle, time, index) {\n var particles = this.emitter ? this.emitter.particles.slice(index) : this.particles.slice(index);\n var otherParticle, lengthSq, overlap, distance;\n var averageMass1, averageMass2;\n \n var i = particles.length;\n while (i--) {\n otherParticle = particles[i];\n if (otherParticle == particle) continue;\n \n this.delta.copy(otherParticle.p).sub(particle.p);\n lengthSq = this.delta.lengthSq();\n distance = particle.radius + otherParticle.radius;\n\n if (lengthSq <= distance * distance) {\n overlap = distance - Math.sqrt(lengthSq);\n overlap += 0.5;\n\n averageMass1 = this._getAverageMass(particle, otherParticle);\n averageMass2 = this._getAverageMass(otherParticle, particle);\n\n particle.p.add(this.delta.clone().normalize().scalar(overlap * -averageMass1));\n otherParticle.p.add(this.delta.normalize().scalar(overlap * averageMass2));\n\n this.callback && this.callback(particle, otherParticle);\n }\n }\n };\n\n Collision.prototype._getAverageMass = function(aPartcile, bParticle) {\n return this.useMass ? bParticle.mass / (aPartcile.mass + bParticle.mass) : 0.5;\n }\n\n Proton.Collision = Collision;\n\n\n\n\n function CrossZone(a, b, life, easing) {\n CrossZone._super_.call(this, life, easing);\n this.reset(a, b);\n ///dead /bound /cross\n this.name = \"CrossZone\";\n }\n\n\n Proton.Util.inherits(CrossZone, Proton.Behaviour);\n CrossZone.prototype.reset = function(a, b, life, easing) {\n var zone, crossType;\n if (typeof a == \"string\") {\n crossType = a;\n zone = b;\n } else {\n crossType = b;\n zone = a;\n }\n \n this.zone = zone;\n this.zone.crossType = Proton.Util.initValue(crossType, \"dead\");\n if (life)\n CrossZone._super_.prototype.reset.call(this, life, easing);\n }\n\n CrossZone.prototype.applyBehaviour = function(particle, time, index) {\n CrossZone._super_.prototype.applyBehaviour.call(this, particle, time, index);\n this.zone.crossing.call(this.zone, particle);\n };\n\n Proton.CrossZone = CrossZone;\n\n\n\n\n /**\n * The Alpha class is the base for the other Proton.Behaviour\n *\n * @class Proton.Behaviour\n * @constructor\n */\n\n function Alpha(a, b, life, easing) {\n Alpha._super_.call(this, life, easing);\n this.reset(a, b);\n /**\n * The Proton.Behaviour name;\n * @property name\n * @type {string}\n */\n this.name = \"Alpha\";\n }\n\n\n Proton.Util.inherits(Alpha, Proton.Behaviour);\n Alpha.prototype.reset = function(a, b, life, easing) {\n if (b == null || b == undefined)\n this._same = true;\n else\n this._same = false;\n\n this.a = Proton.createSpan(Proton.Util.initValue(a, 1));\n this.b = Proton.createSpan(b);\n life && Alpha._super_.prototype.reset.call(this, life, easing);\n }\n\n Alpha.prototype.initialize = function(particle) {\n particle.useAlpha = true;\n particle.transform.alphaA = this.a.getValue();\n if (this._same)\n particle.transform.alphaB = particle.transform.alphaA;\n else\n particle.transform.alphaB = this.b.getValue();\n };\n\n Alpha.prototype.applyBehaviour = function(particle, time, index) {\n Alpha._super_.prototype.applyBehaviour.call(this, particle, time, index);\n\n particle.alpha = Proton.MathUtils.lerp(particle.transform.alphaA, particle.transform.alphaB, this.energy);\n if (particle.alpha < 0.002) particle.alpha = 0;\n };\n\n Proton.Alpha = Alpha;\n\n\n\n /**\n * The Scale class is the base for the other Behaviour\n *\n * @class Behaviour\n * @constructor\n */\n\n function Scale(a, b, life, easing) {\n Scale._super_.call(this, life, easing);\n this.reset(a, b);\n this.name = \"Scale\";\n }\n\n\n Proton.Util.inherits(Scale, Proton.Behaviour);\n Scale.prototype.reset = function(a, b, life, easing) {\n if (b == null || b == undefined)\n this._same = true;\n else\n this._same = false;\n\n this.a = Proton.createSpan(Proton.Util.initValue(a, 1));\n this.b = Proton.createSpan(b);\n\n life && Scale._super_.prototype.reset.call(this, life, easing);\n }\n\n Scale.prototype.initialize = function(particle) {\n particle.transform.scaleA = this.a.getValue();\n particle.transform.oldRadius = particle.radius;\n if (this._same)\n particle.transform.scaleB = particle.transform.scaleA;\n else\n particle.transform.scaleB = this.b.getValue();\n\n };\n\n Scale.prototype.applyBehaviour = function(particle, time, index) {\n Scale._super_.prototype.applyBehaviour.call(this, particle, time, index);\n particle.scale = Proton.MathUtils.lerp(particle.transform.scaleA, particle.transform.scaleB, this.energy);\n\n if (particle.scale < 0.0005) particle.scale = 0;\n particle.radius = particle.transform.oldRadius * particle.scale;\n };\n\n Proton.Scale = Scale;\n\n\n\n\n /* The Rotate class is the base\n * for the other Behaviour\n *\n * @class Behaviour * @constructor \n * @example new Proton.Rotate(Proton.createSpan(-1,1),Proton.createSpan(-1,1),Proton.createSpan(-1,1)); \n * @example new Proton.Rotate(); \n * @example new Proton.Rotate(\"random\"); \n */\n\n function Rotate(x, y, z, life, easing) {\n Rotate._super_.call(this, life, easing);\n this.reset(x, y, z);\n this.name = \"Rotate\";\n }\n\n Proton.Util.inherits(Rotate, Proton.Behaviour);\n Rotate.prototype.reset = function(a, b, c, life, easing) {\n this.a = a || 0;\n this.b = b || 0;\n this.c = c || 0;\n\n if (a === undefined || a == \"same\") {\n this._type = \"same\";\n } else if (b == undefined) {\n this._type = \"set\";\n } else if (c === undefined) {\n this._type = \"to\";\n } else {\n this._type = \"add\";\n this.a = Proton.createSpan(this.a * Proton.DR);\n this.b = Proton.createSpan(this.b * Proton.DR);\n this.c = Proton.createSpan(this.c * Proton.DR);\n }\n\n life && Rotate._super_.prototype.reset.call(this, life, easing);\n }\n\n Rotate.prototype.initialize = function(particle) {\n switch (this._type) {\n case \"same\":\n break;\n\n case \"set\":\n this._setRotation(particle.rotation, this.a);\n break;\n\n case \"to\":\n particle.transform.fR = particle.transform.fR || new Proton.Vector3D;\n particle.transform.tR = particle.transform.tR || new Proton.Vector3D;\n this._setRotation(particle.transform.fR, this.a);\n this._setRotation(particle.transform.tR, this.b);\n break;\n\n case \"add\":\n this._setRotation(particle.rotation, new Proton.Vector3D(0,0,Proton.MathUtils.randomAToB(-Proton.PI, Proton.PI)));\n particle.transform.addR = new Proton.Vector3D(this.a.getValue(), this.b.getValue(), this.c.getValue());\n break;\n }\n };\n\n Rotate.prototype._setRotation = function(vec3, value) {\n vec3 = vec3 || new Proton.Vector3D;\n if (value == \"random\") {\n var x = Proton.MathUtils.randomAToB(-Proton.PI, Proton.PI);\n var y = Proton.MathUtils.randomAToB(-Proton.PI, Proton.PI);\n var z = Proton.MathUtils.randomAToB(-Proton.PI, Proton.PI);\n vec3.set(x, y, z);\n } else if (value instanceof Proton.Vector3D) {\n vec3.copy(value);\n }\n };\n\n Rotate.prototype.applyBehaviour = function(particle, time, index) {\n Rotate._super_.prototype.applyBehaviour.call(this, particle, time, index);\n\n switch (this._type) {\n case \"same\":\n if (!particle.rotation) particle.rotation = new Proton.Vector3D;\n particle.rotation.eulerFromDir(particle.v);\n //http://stackoverflow.com/questions/21622956/how-to-convert-direction-vector-to-euler-angles\n //console.log(particle.rotation);\n break;\n\n case \"set\":\n //\n break;\n\n case \"to\":\n particle.rotation.x = Proton.MathUtils.lerp(particle.transform.fR.x, particle.transform.tR.x, this.energy);\n particle.rotation.y = Proton.MathUtils.lerp(particle.transform.fR.y, particle.transform.tR.y, this.energy);\n particle.rotation.z = Proton.MathUtils.lerp(particle.transform.fR.z, particle.transform.tR.z, this.energy);\n break;\n\n case \"add\":\n particle.rotation.add(particle.transform.addR);\n break;\n }\n };\n\n Proton.Rotate = Rotate;\n\n\n\n /**\n * The Scale class is the base for the other Proton.Behaviour\n *\n * @class Proton.Behaviour\n * @constructor\n */\n function Color(a, b, life, easing) {\n Color._super_.call(this, life, easing);\n this.reset(a, b);\n this.name = \"Color\";\n }\n\n\n Proton.Util.inherits(Color, Proton.Behaviour);\n Color.prototype.reset = function(a, b, life, easing) {\n if (b == null || b == undefined)\n this._same = true;\n else\n this._same = false;\n\n this.a = Proton.createArraySpan(a);\n this.b = Proton.createArraySpan(b);\n life && Color._super_.prototype.reset.call(this, life, easing);\n }\n\n Color.prototype.initialize = function(particle) {\n particle.transform.colorA = Proton.ColorUtil.getRGB(this.a.getValue());\n\n particle.useColor = true;\n if (this._same)\n particle.transform.colorB = particle.transform.colorA;\n else\n particle.transform.colorB = Proton.ColorUtil.getRGB(this.b.getValue());\n };\n\n Color.prototype.applyBehaviour = function(particle, time, index) {\n Color._super_.prototype.applyBehaviour.call(this, particle, time, index);\n\n if (!this._same) {\n particle.color.r = Proton.MathUtils.lerp(particle.transform.colorA.r, particle.transform.colorB.r, this.energy) ;\n particle.color.g = Proton.MathUtils.lerp(particle.transform.colorA.g, particle.transform.colorB.g, this.energy) ;\n particle.color.b = Proton.MathUtils.lerp(particle.transform.colorA.b, particle.transform.colorB.b, this.energy) ;\n } else {\n particle.color.r = particle.transform.colorA.r;\n particle.color.g = particle.transform.colorA.g;\n particle.color.b = particle.transform.colorA.b;\n }\n };\n\n\n Proton.Color = Color;\n\n\n\n /**\n * The Behaviour class is the base for the other Behaviour\n *\n * @class Behaviour\n * @constructor\n */\n function Spring(x, y, z, spring, friction, life, easing) {\n Spring._super_.call(this, life, easing);\n Spring.prototype.reset(x, y, z, spring, friction);\n this.name = \"Spring\";\n }\n\n Proton.Util.inherits(Spring, Proton.Behaviour);\n Spring.prototype.reset = function(x, y, z, spring, friction) {\n if (!this.pos)\n this.pos = new Proton.Vector3D(x, y, z);\n else\n this.pos.set(x, y, z);\n this.spring = spring || .1;\n this.friction = friction || .98;\n }\n\n Spring.prototype.applyBehaviour = function(particle, time, index) {\n Spring._super_.prototype.applyBehaviour.call(this, particle, time, index);\n\n particle.v.x += (this.pos.x - particle.p.x) * this.spring;\n particle.v.y += (this.pos.y - particle.p.y) * this.spring;\n particle.v.z += (this.pos.z - particle.p.z) * this.spring;\n\n };\n\n\n Proton.Spring = Spring;\n\n\n\n function Emitter(pObj) {\n this.initializes = [];\n this.particles = [];\n this.behaviours = [];\n this.currentEmitTime = 0;\n this.totalEmitTimes = -1;\n\n /**\n * @property {Number} damping -The friction coefficient for all particle emit by This;\n * @default 0.006\n */\n this.damping = .006;\n /**\n * If bindEmitter the particles can bind this emitter's property;\n * @property bindEmitter\n * @type {Boolean}\n * @default true\n */\n this.bindEmitter = true;\n /**\n * The number of particles per second emit (a [particle]/b [s]);\n * @property rate\n * @type {Rate}\n * @default Rate(1, .1)\n */\n this.rate = new Proton.Rate(1, .1);\n Emitter._super_.call(this, pObj);\n /**\n * The emitter's id;\n * @property id\n * @type {String} id\n */\n this.id = 'emitter_' + Emitter.ID++;\n this.cID = 0;\n this.name = 'Emitter';\n };\n Emitter.ID = 0;\n\n Proton.Util.inherits(Emitter, Proton.Particle);\n Proton.EventDispatcher.initialize(Emitter.prototype);\n\n /**\n * start emit particle\n * @method emit\n * @param {Number} totalEmitTimes total emit times;\n * @param {String} life the life of this emitter\n */\n Emitter.prototype.emit = function(totalEmitTimes, life) {\n this.currentEmitTime = 0;\n this.totalEmitTimes = Proton.Util.initValue(totalEmitTimes, Infinity);\n\n if (life == true || life == 'life' || life == 'destroy') {\n this.life = totalEmitTimes == 'once' ? 1 : this.totalEmitTimes;\n } else if (!isNaN(life)) {\n this.life = life;\n }\n\n this.rate.init();\n };\n\n /**\n * stop emiting\n * @method stopEmit\n */\n Emitter.prototype.stopEmit = function() {\n this.totalEmitTimes = -1;\n this.currentEmitTime = 0;\n };\n\n /**\n * remove current all particles\n * @method removeAllParticles\n */\n Emitter.prototype.removeAllParticles = function() {\n var i = this.particles.length;\n while (i--){\n this.particles[i].dead = true;\n this.particles[i].target.parent.remove(this.particles[i].target);\n }\n };\n\n /**\n * create single particle;\n * \n * can use emit({x:10},new Gravity(10),{'particleUpdate',fun}) or emit([{x:10},new Initialize],new Gravity(10),{'particleUpdate',fun})\n * @method createParticle\n */\n Emitter.prototype.createParticle = function(initialize, behaviour) {\n var particle = this.parent.pool.get(Proton.Particle);\n this.setupParticle(particle, initialize, behaviour);\n this.parent && this.parent.dispatchEvent(\"PARTICLE_CREATED\", particle);\n Proton.bindEmtterEvent && this.dispatchEvent(\"PARTICLE_CREATED\", particle);\n\n return particle;\n };\n /**\n * add initialize to this emitter\n * @method addSelfInitialize\n */\n Emitter.prototype.addSelfInitialize = function(pObj) {\n if (pObj['init']) {\n pObj.init(this);\n } else {\n this.initAll();\n }\n };\n\n\n /**\n * add the Initialize to particles;\n * \n * you can use initializes array:for example emitter.addInitialize(initialize1,initialize2,initialize3);\n * @method addInitialize\n * @param {Initialize} initialize like this new Radius(1, 12)\n */\n Emitter.prototype.addInitialize = function() {\n var i = arguments.length;\n while (i--) this.initializes.push(arguments[i]);\n };\n\n\n /**\n * remove the Initialize\n * @method removeInitialize\n * @param {Initialize} initialize a initialize\n */\n Emitter.prototype.removeInitialize = function(initializer) {\n var index = this.initializes.indexOf(initializer);\n if (index > -1) this.initializes.splice(index, 1);\n };\n\n /**\n * remove all Initializes\n * @method removeInitializers\n */\n Emitter.prototype.removeInitializers = function() {\n Proton.Util.destroyArray(this.initializes);\n };\n /**\n * add the Behaviour to particles;\n * \n * you can use Behaviours array:emitter.addBehaviour(Behaviour1,Behaviour2,Behaviour3);\n * @method addBehaviour\n * @param {Behaviour} behaviour like this new Color('random')\n */\n Emitter.prototype.addBehaviour = function() {\n var i = arguments.length;\n while (i--) this.behaviours.push(arguments[i]);\n };\n /**\n * remove the Behaviour\n * @method removeBehaviour\n * @param {Behaviour} behaviour a behaviour\n */\n Emitter.prototype.removeBehaviour = function(behaviour) {\n var index = this.behaviours.indexOf(behaviour);\n if (index > -1) this.behaviours.splice(index, 1);\n };\n /**\n * remove all behaviours\n * @method removeAllBehaviours\n */\n Emitter.prototype.removeAllBehaviours = function() {\n Proton.Util.destroyArray(this.behaviours);\n };\n\n Emitter.prototype.integrate = function(time) {\n var damping = 1 - this.damping;\n Proton.integrator.integrate(this, time, damping);\n\n var i = this.particles.length;\n while (i--) {\n var particle = this.particles[i];\n particle.update(time, i);\n Proton.integrator.integrate(particle, time, damping);\n\n this.parent && this.parent.dispatchEvent(\"PARTICLE_UPDATE\", particle);\n Proton.bindEmtterEvent && this.dispatchEvent(\"PARTICLE_UPDATE\", particle);\n }\n };\n\n Emitter.prototype.emitting = function(time) {\n if (this.totalEmitTimes == 'once') {\n var i = this.rate.getValue(99999);\n if (i > 0) this.cID = i;\n while (i--) this.createParticle();\n this.totalEmitTimes = 'none';\n\n } else if (!isNaN(this.totalEmitTimes)) {\n this.currentEmitTime += time;\n if (this.currentEmitTime < this.totalEmitTimes) {\n var i = this.rate.getValue(time);\n if (i > 0) this.cID = i;\n while (i--) this.createParticle();\n }\n }\n }\n\n Emitter.prototype.update = function(time) {\n this.age += time;\n if (this.dead || this.age >= this.life) {\n this.destroy();\n }\n\n this.emitting(time);\n this.integrate(time);\n\n var particle, i = this.particles.length;\n while (i--) {\n particle = this.particles[i];\n if (particle.dead) {\n this.parent && this.parent.dispatchEvent(\"PARTICLE_DEAD\", particle);\n Proton.bindEmtterEvent && this.dispatchEvent(\"PARTICLE_DEAD\", particle);\n\n this.parent.pool.expire(particle.reset());\n this.particles.splice(i, 1);\n }\n }\n };\n\n Emitter.prototype.setupParticle = function(particle, initialize, behaviour) {\n var initializes = this.initializes;\n var behaviours = this.behaviours;\n\n if (initialize) {\n if (Proton.Util.isArray(initialize))\n initializes = initialize;\n else\n initializes = [initialize];\n }\n\n if (behaviour) {\n if (Proton.Util.isArray(behaviour))\n behaviours = behaviour;\n else\n behaviours = [behaviour];\n }\n\n Proton.InitializeUtil.initialize(this, particle, initializes);\n particle.addBehaviours(behaviours);\n particle.parent = this;\n this.particles.push(particle);\n };\n\n /**\n * Destory this Emitter\n * @method destroy\n */\n Emitter.prototype.destroy = function() {\n this.dead = true;\n this.energy = 0;\n this.totalEmitTimes = -1;\n\n if (this.particles.length == 0) {\n this.removeInitializers();\n this.removeAllBehaviours();\n\n this.parent && this.parent.removeEmitter(this);\n }\n }\n\n\n Proton.Emitter = Emitter;\n\n\n\n /**\n * The BehaviourEmitter class inherits from Proton.Emitter\n *\n * use the BehaviourEmitter you can add behaviours to self;\n * @class Proton.BehaviourEmitter\n * @constructor\n * @param {Object} pObj the parameters object;\n */\n function BehaviourEmitter(pObj) {\n this.selfBehaviours = [];\n BehaviourEmitter._super_.call(this, pObj);\n };\n\n Proton.Util.inherits(BehaviourEmitter, Proton.Emitter);\n /**\n * add the Behaviour to emitter;\n *\n * you can use Behaviours array:emitter.addSelfBehaviour(Behaviour1,Behaviour2,Behaviour3);\n * @method addSelfBehaviour\n * @param {Proton.Behaviour} behaviour like this new Proton.Color('random')\n */\n BehaviourEmitter.prototype.addSelfBehaviour = function() {\n var length = arguments.length,\n i;\n for (i = 0; i < length; i++) {\n this.selfBehaviours.push(arguments[i]);\n }\n };\n /**\n * remove the Behaviour for self\n * @method removeSelfBehaviour\n * @param {Proton.Behaviour} behaviour a behaviour\n */\n BehaviourEmitter.prototype.removeSelfBehaviour = function(behaviour) {\n var index = this.selfBehaviours.indexOf(behaviour);\n if (index > -1) this.selfBehaviours.splice(index, 1);\n };\n\n BehaviourEmitter.prototype.update = function(time) {\n BehaviourEmitter._super_.prototype.update.call(this, time);\n\n if (!this.sleep) {\n var length = this.selfBehaviours.length,\n i;\n for (i = 0; i < length; i++) {\n this.selfBehaviours[i].applyBehaviour(this, time, i)\n }\n }\n }\n\n Proton.BehaviourEmitter = BehaviourEmitter;\n\n\n\n /**\n * The FollowEmitter class inherits from Proton.Emitter\n *\n * use the FollowEmitter will emit particle when mousemoving\n *\n * @class Proton.FollowEmitter\n * @constructor\n * @param {Element} mouseTarget mouseevent's target;\n * @param {Number} ease the easing of following speed;\n * @default 0.7\n * @param {Object} pObj the parameters object;\n */\n function FollowEmitter(mouseTarget, ease, pObj) {\n this.mouseTarget = Proton.Util.initValue(mouseTarget, window);\n this.ease = Proton.Util.initValue(ease, .7);\n this._allowEmitting = false;\n this.mouse = new Proton.Vector3D();\n this.initEventHandler();\n\n FollowEmitter._super_.call(this, pObj);\n };\n\n Proton.Util.inherits(FollowEmitter, Proton.Emitter);\n FollowEmitter.prototype.initEventHandler = function() {\n var self = this;\n this.mousemoveHandler = function(e) {\n self.mousemove.call(self, e);\n };\n\n this.mousedownHandler = function(e) {\n self.mousedown.call(self, e);\n };\n\n this.mouseupHandler = function(e) {\n self.mouseup.call(self, e);\n };\n \n this.mouseTarget.addEventListener('mousemove', this.mousemoveHandler, false);\n }\n\n /**\n * start emit particle\n * @method emit\n */\n FollowEmitter.prototype.emit = function() {\n this._allowEmitting = true;\n }\n\n /**\n * stop emiting\n * @method stopEmit\n */\n FollowEmitter.prototype.stopEmit = function() {\n this._allowEmitting = false;\n }\n\n FollowEmitter.prototype.setCameraAndCanvas = function(camera, canvas) {\n this.camera = camera;\n this.canvas = canvas;\n }\n\n FollowEmitter.prototype.setCameraAndRenderer = function(camera, renderer) {\n this.camera = camera;\n this.renderer = renderer;\n this.canvas = renderer.domElement;\n }\n\n FollowEmitter.prototype.mousemove = function(e) {\n var rect = this.canvas.getBoundingClientRect();\n var x = e.clientX - rect.left;\n var y = e.clientY - rect.top;\n var ratio = this.renderer? this.renderer.getPixelRatio() : 1;\n x *= ratio;\n y *= ratio;\n\n this.mouse.x += (x - this.mouse.x) * this.ease;\n this.mouse.y += (y - this.mouse.y) * this.ease;\n \n this.p.copy(Proton.THREEUtil.toSpacePos(this.mouse, this.camera, this.canvas, this.renderer));\n\n if (this._allowEmitting){\n FollowEmitter._super_.prototype.emit.call(this, 'once');\n }\n };\n\n /**\n * Destory this Emitter\n * @method destroy\n */\n FollowEmitter.prototype.destroy = function() {\n FollowEmitter._super_.prototype.destroy.call(this);\n this.mouseTarget.removeEventListener('mousemove', this.mousemoveHandler, false);\n }\n\n Proton.FollowEmitter = FollowEmitter;\n\n\n\n /**\n * The Ease class provides a collection of easing functions for use with Proton\n */\n var ease = ease || {\n easeLinear: function(value) {\n return value;\n },\n\n easeInQuad: function(value) {\n return Math.pow(value, 2);\n },\n\n easeOutQuad: function(value) {\n return -(Math.pow((value - 1), 2) - 1);\n },\n\n easeInOutQuad: function(value) {\n if ((value /= 0.5) < 1)\n return 0.5 * Math.pow(value, 2);\n return -0.5 * ((value -= 2) * value - 2);\n },\n\n easeInCubic: function(value) {\n return Math.pow(value, 3);\n },\n\n easeOutCubic: function(value) {\n return (Math.pow((value - 1), 3) + 1);\n },\n\n easeInOutCubic: function(value) {\n if ((value /= 0.5) < 1)\n return 0.5 * Math.pow(value, 3);\n return 0.5 * (Math.pow((value - 2), 3) + 2);\n },\n\n easeInQuart: function(value) {\n return Math.pow(value, 4);\n },\n\n easeOutQuart: function(value) {\n return -(Math.pow((value - 1), 4) - 1);\n },\n\n easeInOutQuart: function(value) {\n if ((value /= 0.5) < 1)\n return 0.5 * Math.pow(value, 4);\n return -0.5 * ((value -= 2) * Math.pow(value, 3) - 2);\n },\n\n easeInSine: function(value) {\n return -Math.cos(value * (Proton.PI / 2)) + 1;\n },\n\n easeOutSine: function(value) {\n return Math.sin(value * (Proton.PI / 2));\n },\n\n easeInOutSine: function(value) {\n return (-0.5 * (Math.cos(Proton.PI * value) - 1));\n },\n\n easeInExpo: function(value) {\n return (value === 0) ? 0 : Math.pow(2, 10 * (value - 1));\n },\n\n easeOutExpo: function(value) {\n return (value === 1) ? 1 : -Math.pow(2, -10 * value) + 1;\n },\n\n easeInOutExpo: function(value) {\n if (value === 0)\n return 0;\n if (value === 1)\n return 1;\n if ((value /= 0.5) < 1)\n return 0.5 * Math.pow(2, 10 * (value - 1));\n return 0.5 * (-Math.pow(2, -10 * --value) + 2);\n },\n\n easeInCirc: function(value) {\n return -(Math.sqrt(1 - (value * value)) - 1);\n },\n\n easeOutCirc: function(value) {\n return Math.sqrt(1 - Math.pow((value - 1), 2));\n },\n\n easeInOutCirc: function(value) {\n if ((value /= 0.5) < 1)\n return -0.5 * (Math.sqrt(1 - value * value) - 1);\n return 0.5 * (Math.sqrt(1 - (value -= 2) * value) + 1);\n },\n\n easeInBack: function(value) {\n var s = 1.70158;\n return (value) * value * ((s + 1) * value - s);\n },\n\n easeOutBack: function(value) {\n var s = 1.70158;\n return (value = value - 1) * value * ((s + 1) * value + s) + 1;\n },\n\n easeInOutBack: function(value) {\n var s = 1.70158;\n if ((value /= 0.5) < 1)\n return 0.5 * (value * value * (((s *= (1.525)) + 1) * value - s));\n return 0.5 * ((value -= 2) * value * (((s *= (1.525)) + 1) * value + s) + 2);\n },\n\n setEasingByName: function(easeName) {\n if (!!ease[easeName])\n return ease[easeName];\n else\n return ease.easeLinear;\n }\n }\n\n\n for (var id in ease) {\n if (id != \"setEasingByName\") Proton[id] = ease[id];\n }\n\n Proton.ease = ease;\n\n\n\n\n\n function BaseRender() { this.name = \"BaseRender\"; }\n\n BaseRender.prototype = {\n init: function(proton) {\n var self = this;\n this.proton = proton;\n \n this.proton.addEventListener(\"PROTON_UPDATE\", function(proton) {\n self.onProtonUpdate.call(self, proton);\n });\n\n this.proton.addEventListener(\"PARTICLE_CREATED\", function(particle) {\n self.onParticleCreated.call(self, particle);\n });\n\n this.proton.addEventListener(\"PARTICLE_UPDATE\", function(particle) {\n self.onParticleUpdate.call(self, particle);\n });\n\n this.proton.addEventListener(\"PARTICLE_DEAD\", function(particle) {\n self.onParticleDead.call(self, particle);\n });\n },\n\n remove: function(proton) {\n // this.proton.removeEventListener(\"PROTON_UPDATE\", this.onProtonUpdate);\n // this.proton.removeEventListener(\"PARTICLE_CREATED\", this.onParticleCreated);\n // this.proton.removeEventListener(\"PARTICLE_UPDATE\", this.onParticleUpdate);\n // this.proton.removeEventListener(\"PARTICLE_DEAD\", this.onParticleDead);\n this.proton = null;\n },\n\n onParticleCreated: function(particle) {\n\n },\n\n onParticleUpdate: function(particle) {\n\n },\n\n onParticleDead: function(particle) {\n\n },\n\n onProtonUpdate: function(proton) {\n\n }\n }\n\n Proton.BaseRender = BaseRender;\n\n\n\n\n function MeshRender(container) {\n MeshRender._super_.call(this);\n this.container = container;\n\n this._targetPool = new Proton.Pool();\n this._materialPool = new Proton.Pool();\n this._body = new THREE.Mesh(\n new THREE.BoxGeometry(50, 50, 50),\n new THREE.MeshLambertMaterial({ color: \"#ff0000\" })\n );\n \n this.name = \"MeshRender\";\n }\n\n Proton.Util.inherits(MeshRender, Proton.BaseRender);\n\n MeshRender.prototype.onProtonUpdate = function() {};\n\n MeshRender.prototype.onParticleCreated = function(particle) {\n if (!particle.target) {\n //set target\n if (!particle.body) particle.body = this._body;\n particle.target = this._targetPool.get(particle.body);\n \n //set material\n if (particle.useAlpha || particle.useColor) {\n particle.target.material.__puid = Proton.PUID.id(particle.body.material);;\n particle.target.material = this._materialPool.get(particle.target.material);\n }\n }\n\n if (particle.target) {\n particle.target.position.copy(particle.p);\n this.container.add(particle.target);\n }\n };\n\n MeshRender.prototype.onParticleUpdate = function(particle) {\n if (particle.target) {\n particle.target.position.copy(particle.p);\n particle.target.rotation.set(particle.rotation.x, particle.rotation.y, particle.rotation.z);\n this.scale(particle);\n\n if (particle.useAlpha) {\n particle.target.material.opacity = particle.alpha;\n particle.target.material.transparent = true;\n }\n\n if (particle.useColor) {\n particle.target.material.color.copy(particle.color);\n }\n }\n };\n\n MeshRender.prototype.scale = function(particle) {\n particle.target.scale.set(particle.scale*particle.radius, particle.scale*particle.radius, particle.scale*particle.radius);\n }\n\n MeshRender.prototype.onParticleDead = function(particle) {\n if (particle.target) {\n if (particle.useAlpha || particle.useColor)\n this._materialPool.expire(particle.target.material);\n\n this._targetPool.expire(particle.target);\n this.container.remove(particle.target);\n particle.target = null;\n }\n };\n\n Proton.MeshRender = MeshRender;\n\n\n\n\n function PointsRender(ps) {\n PointsRender._super_.call(this);\n this.points = ps;\n this.name = \"PointsRender\";\n }\n\n Proton.Util.inherits(PointsRender, Proton.BaseRender);\n\n PointsRender.prototype.onProtonUpdate = function() {\n \n };\n\n PointsRender.prototype.onParticleCreated = function(particle) {\n if (!particle.target) {\n particle.target = new THREE.Vector3();\n }\n\n particle.target.copy(particle.p);\n this.points.geometry.vertices.push(particle.target);\n };\n\n PointsRender.prototype.onParticleUpdate = function(particle) {\n if (particle.target) {\n particle.target.copy(particle.p);\n }\n };\n\n PointsRender.prototype.onParticleDead = function(particle) {\n if (particle.target) {\n var index = this.points.geometry.vertices.indexOf(particle.target);\n if (index > -1)\n this.points.geometry.vertices.splice(index, 1);\n \n particle.target = null;\n }\n };\n\n Proton.PointsRender = PointsRender;\n\n\n\n\n function SpriteRender(container) {\n SpriteRender._super_.call(this, container);\n\n this._body = new THREE.Sprite(new THREE.SpriteMaterial({ color: 0xffffff }));\n this.name = \"SpriteRender\";\n }\n\n Proton.Util.inherits(SpriteRender, Proton.MeshRender);\n\n SpriteRender.prototype.scale = function(particle) {\n particle.target.scale.set(particle.scale * particle.radius, particle.scale * particle.radius, 1);\n };\n\n Proton.SpriteRender = SpriteRender;\n\n\n\n\n function CustomRender() {\n CustomRender._super_.call(this);\n this.targetPool = new Proton.Pool();\n this.materialPool = new Proton.Pool();\n \n this.name = \"CustomRender\";\n }\n\n Proton.Util.inherits(CustomRender, Proton.BaseRender);\n\n CustomRender.prototype.onProtonUpdate = function() {};\n\n CustomRender.prototype.onParticleCreated = function(particle) {\n \n };\n\n CustomRender.prototype.onParticleUpdate = function(particle) {\n \n };\n\n CustomRender.prototype.onParticleDead = function(particle) {\n \n };\n\n Proton.CustomRender = CustomRender;\n\n\n\n /**\n * Zone is a base class.\n * @constructor\n */\n function Zone() {\n this.vector = new Proton.Vector3D(0, 0, 0);\n this.random = 0;\n this.crossType = \"dead\";\n this.log = true;\n }\n\n Zone.prototype = {\n getPosition: function() {\n return null;\n },\n\n crossing: function(particle) {\n switch (this.crossType) {\n case \"bound\":\n this._bound(particle);\n break;\n\n case \"cross\":\n this._cross(particle);\n break;\n\n case \"dead\":\n this._dead(particle);\n break;\n }\n },\n\n _dead: function(particle) {},\n _bound: function(particle) {},\n _cross: function(particle) {},\n };\n\n Proton.Zone = Zone;\n\n\n\n /**\n * LineZone is a 3d line zone\n * @param {Number|Vector3D} x1 - the line's start point of x value or a Vector3D Object\n * @param {Number|Vector3D} y1 - the line's start point of y value or a Vector3D Object\n * @param {Number} z1 - the line's start point of z value \n * @param {Number} x2 - the line's end point of x value \n * @param {Number} y2 - the line's end point of y value \n * @param {Number} z2 - the line's end point of z value \n * @example \n * var lineZone = new Proton.LineZone(0,0,0,100,100,0);\n * or\n * var lineZone = new Proton.LineZone(new Proton.Vector3D(0,0,0),new Proton.Vector3D(100,100,0));\n * @extends {Zone}\n * @constructor\n */\n function LineZone(x1, y1, z1, x2, y2, z2) {\n LineZone._super_.call(this);\n if (x1 instanceof Proton.Vector3D) {\n this.x1 = x1.x;\n this.y1 = x1.y;\n this.z1 = x1.z;\n\n this.x2 = x2.x;\n this.y2 = x2.y;\n this.z2 = x2.z;\n } else {\n this.x1 = x1;\n this.y1 = y1;\n this.z1 = z1;\n\n this.x2 = x2;\n this.y2 = y2;\n this.z2 = z2;\n }\n }\n\n\n Proton.Util.inherits(LineZone, Proton.Zone);\n LineZone.prototype.getPosition = function() {\n this.random = Math.random();\n this.vector.x = this.x1 + this.random * (this.x2 - this.x1);\n this.vector.y = this.y1 + this.random * (this.y2 - this.y1);\n this.vector.z = this.z1 + this.random * (this.z2 - this.z1);\n return this.vector;\n }\n\n LineZone.prototype.crossing = function(particle) {\n if (this.log) {\n console.error('Sorry LineZone does not support crossing method');\n this.log = false;\n }\n }\n\n Proton.LineZone = LineZone;\n\n\n\n /**\n * SphereZone is a sphere zone\n * @param {Number|Vector3D} x - the center's x value or a Vector3D Object\n * @param {Number} y - the center's y value or the Sphere's radius \n * @param {Number} z - the center's z value \n * @param {Number} r - the Sphere's radius \n * @example \n * var sphereZone = new Proton.SphereZone(0,0,0,100);\n * var sphereZone = new Proton.SphereZone(new Proton.Vector3D(0,0,0),100);\n * @extends {Proton.Zone}\n * @constructor\n */\n function SphereZone(a, b, c, d) {\n var x, y, z, r;\n SphereZone._super_.call(this);\n if (Proton.Util.isUndefined(b, c, d)) {\n x = y = z = 0;\n r = (a || 100);\n } else {\n x = a;\n y = b;\n z = c;\n r = d;\n }\n\n this.x = x;\n this.y = x;\n this.z = x;\n this.radius = r;\n this.tha = this.phi = 0;\n }\n\n Proton.Util.inherits(SphereZone, Proton.Zone);\n SphereZone.prototype.getPosition = function() {\n var tha, phi, r;\n return function() {\n this.random = Math.random();\n\n r = this.random * this.radius;\n tha = Proton.PI * Math.random(); //[0-pi]\n phi = Proton.PI * 2 * Math.random(); //[0-2pi]\n\n this.vector.x = this.x + r * Math.sin(tha) * Math.cos(phi);\n this.vector.y = this.y + r * Math.sin(phi) * Math.sin(tha);\n this.vector.z = this.z + r * Math.cos(tha);\n\n return this.vector;\n }\n }();\n\n SphereZone.prototype._dead = function(particle) {\n var d = particle.p.distanceTo(this);\n if (d - particle.radius > this.radius) particle.dead = true;\n }\n\n SphereZone.prototype._bound = function() {\n var normal = new Proton.Vector3D,\n v = new Proton.Vector3D,\n k;\n\n return function(particle) {\n var d = particle.p.distanceTo(this);\n if (d + particle.radius >= this.radius) {\n normal.copy(particle.p).sub(this).normalize();\n v.copy(particle.v);\n k = 2 * v.dot(normal);\n particle.v.sub(normal.scalar(k));\n }\n }\n }();\n\n SphereZone.prototype._cross = function(particle) {\n if (this.log) {\n console.error('Sorry SphereZone does not support _cross method');\n this.log = false;\n }\n }\n\n Proton.SphereZone = SphereZone;\n\n\n\n\n /**\n * MeshZone is a threejs mesh zone\n * @param {Mesh} geometry - a THREE.Mesh object\n * @example \n * var geometry = new THREE.CylinderGeometry( 5, 5, 20, 32 );\n * var cylinder = new THREE.Mesh( geometry, material );\n * var meshZone = new Proton.MeshZone(geometry);\n * or\n * var meshZone = new Proton.MeshZone(cylinder);\n * @extends {Proton.Zone}\n * @constructor\n */\n\n function MeshZone(geometry, scale) {\n MeshZone._super_.call(this);\n \n this.geometry = geometry.geometry.toBufferGeometry();\n\n this.scale = scale || 1;\n }\n\n Proton.Util.inherits(MeshZone, Proton.Zone);\n MeshZone.prototype.getPosition = function() {\n var vertices = this.geometry.vertices;\n var rVector = vertices[(vertices.length * Math.random()) >> 0];\n this.vector.x = rVector.x * this.scale;\n this.vector.y = rVector.y * this.scale;\n this.vector.z = rVector.z * this.scale;\n return this.vector;\n }\n\n MeshZone.prototype.crossing = function(particle) {\n if (this.log) {\n console.error('Sorry MeshZone does not support crossing method');\n this.log = false;\n }\n }\n\n Proton.MeshZone = MeshZone;\n\n\n\n /**\n * PointZone is a point zone\n * @param {Number|Vector3D} x - the center's x value or a Vector3D Object\n * @param {Number} y - the center's y value\n * @param {Number} z - the center's z value \n * @example \n * var pointZone = new Proton.PointZone(0,30,10);\n * or\n * var pointZone = new Proton.PointZone(new Proton.Vector3D(0,30,10));\n * @extends {Zone}\n * @constructor\n */\n function PointZone(a, b, c) {\n var x, y, z;\n PointZone._super_.call(this);\n\n if (Proton.Util.isUndefined(a, b, c)) {\n x = y = z = 0;\n } else {\n x = a;\n y = b;\n z = c;\n }\n\n this.x = x;\n this.y = y;\n this.z = z;\n }\n\n Proton.Util.inherits(PointZone, Proton.Zone);\n PointZone.prototype.getPosition = function() {\n this.vector.x = this.x;\n this.vector.y = this.y;\n this.vector.z = this.z;\n return this.vector;\n }\n\n PointZone.prototype.crossing = function(particle) {\n if (this.log) {\n console.error('Sorry PointZone does not support crossing method');\n this.log = false;\n }\n }\n\n Proton.PointZone = PointZone;\n\n\n\n /**\n * BoxZone is a box zone\n * @param {Number|Proton.Vector3D} x - the position's x value or a Proton.Vector3D Object\n * @param {Number} y - the position's y value \n * @param {Number} z - the position's z value \n * @param {Number} w - the Box's width \n * @param {Number} h - the Box's height \n * @param {Number} d - the Box's depth \n * @example \n * var boxZone = new Proton.BoxZone(0,0,0,50,50,50);\n * or\n * var boxZone = new Proton.BoxZone(new Proton.Proton.Vector3D(0,0,0), 50, 50, 50);\n * @extends {Proton.Zone}\n * @constructor\n */\n function BoxZone(a, b, c, d, e, f) {\n var x, y, z, w, h, d;\n BoxZone._super_.call(this);\n\n if (Proton.Util.isUndefined(b, c, d, e, f)) {\n x = y = z = 0;\n w = h = d = (a || 100);\n } else if (Proton.Util.isUndefined(d, e, f)) {\n x = y = z = 0;\n w = a;\n h = b;\n d = c;\n } else {\n x = a;\n y = b;\n z = c;\n w = d;\n h = e;\n d = f;\n }\n\n this.x = x;\n this.y = y;\n this.z = z;\n this.width = w;\n this.height = h;\n this.depth = d;\n\n //\n this.friction = 0.85;\n this.max = 6;\n }\n\n Proton.Util.inherits(BoxZone, Proton.Zone);\n BoxZone.prototype.getPosition = function() {\n this.vector.x = this.x + Proton.MathUtils.randomAToB(-.5, .5) * this.width;\n this.vector.y = this.y + Proton.MathUtils.randomAToB(-.5, .5) * this.height;\n this.vector.z = this.z + Proton.MathUtils.randomAToB(-.5, .5) * this.depth;\n return this.vector;\n }\n\n BoxZone.prototype._dead = function(particle) {\n if (particle.p.x + particle.radius < this.x - this.width / 2)\n particle.dead = true;\n else if (particle.p.x - particle.radius > this.x + this.width / 2)\n particle.dead = true;\n\n if (particle.p.y + particle.radius < this.y - this.height / 2)\n particle.dead = true;\n else if (particle.p.y - particle.radius > this.y + this.height / 2)\n particle.dead = true;\n\n if (particle.p.z + particle.radius < this.z - this.depth / 2)\n particle.dead = true;\n else if (particle.p.z - particle.radius > this.z + this.depth / 2)\n particle.dead = true;\n }\n\n BoxZone.prototype._bound = function(particle) {\n if (particle.p.x - particle.radius < this.x - this.width / 2) {\n particle.p.x = this.x - this.width / 2 + particle.radius;\n particle.v.x *= -this.friction;\n this._static(particle, \"x\");\n } else if (particle.p.x + particle.radius > this.x + this.width / 2) {\n particle.p.x = this.x + this.width / 2 - particle.radius;\n particle.v.x *= -this.friction;\n this._static(particle, \"x\");\n }\n\n if (particle.p.y - particle.radius < this.y - this.height / 2) {\n particle.p.y = this.y - this.height / 2 + particle.radius;\n particle.v.y *= -this.friction;\n this._static(particle, \"y\");\n } else if (particle.p.y + particle.radius > this.y + this.height / 2) {\n particle.p.y = this.y + this.height / 2 - particle.radius;\n particle.v.y *= -this.friction;\n this._static(particle, \"y\");\n }\n\n if (particle.p.z - particle.radius < this.z - this.depth / 2) {\n particle.p.z = this.z - this.depth / 2 + particle.radius;\n particle.v.z *= -this.friction;\n this._static(particle, \"z\");\n } else if (particle.p.z + particle.radius > this.z + this.depth / 2) {\n particle.p.z = this.z + this.depth / 2 - particle.radius;\n particle.v.z *= -this.friction;\n this._static(particle, \"z\");\n }\n }\n\n BoxZone.prototype._static = function(particle, axis) {\n if (particle.v[axis] * particle.a[axis] > 0) return;\n if (Math.abs(particle.v[axis]) < Math.abs(particle.a[axis]) * 0.0167 * this.max) {\n particle.v[axis] = 0;\n particle.a[axis] = 0;\n }\n }\n\n BoxZone.prototype._cross = function(particle) {\n if (particle.p.x + particle.radius < this.x - this.width / 2 && particle.v.x <= 0)\n particle.p.x = this.x + this.width / 2 + particle.radius;\n else if (particle.p.x - particle.radius > this.x + this.width / 2 && particle.v.x >= 0)\n particle.p.x = this.x - this.width / 2 - particle.radius;\n\n if (particle.p.y + particle.radius < this.y - this.height / 2 && particle.v.y <= 0)\n particle.p.y = this.y + this.height / 2 + particle.radius;\n else if (particle.p.y - particle.radius > this.y + this.height / 2 && particle.v.y >= 0)\n particle.p.y = this.y - this.height / 2 - particle.radius;\n\n if (particle.p.z + particle.radius < this.z - this.depth / 2 && particle.v.z <= 0)\n particle.p.z = this.z + this.depth / 2 + particle.radius;\n else if (particle.p.z - particle.radius > this.z + this.depth / 2 && particle.v.z >= 0)\n particle.p.z = this.z - this.depth / 2 - particle.radius;\n }\n\n Proton.BoxZone = BoxZone;\n\n\n\n /**\n * ScreenZone is a 3d line zone\n * @param {Number|Vector3D} x1 - the line's start point of x value or a Vector3D Object\n * @param {Number|Vector3D} y1 - the line's start point of y value or a Vector3D Object\n * @param {Number} z1 - the line's start point of z value \n * @param {Number} x2 - the line's end point of x value \n * @param {Number} y2 - the line's end point of y value \n * @param {Number} z2 - the line's end point of z value \n * @example \n * var lineZone = new Proton.ScreenZone(0,0,0,100,100,0);\n * or\n * var lineZone = new Proton.ScreenZone(new Proton.Vector3D(0,0,0),new Proton.Vector3D(100,100,0));\n * @extends {Zone}\n * @constructor\n */\n function ScreenZone(camera, renderer, dis, dir) {\n ScreenZone._super_.call(this);\n\n this.camera = camera;\n this.renderer = renderer;\n this.dis = dis || 20;\n dir = dir || \"1234\";\n for (var i = 1; i < 5; i++)\n this[\"d\" + i] = dir.indexOf(i + \"\") >= 0;\n\n this.name = \"ScreenZone\";\n }\n\n\n Proton.Util.inherits(ScreenZone, Proton.Zone);\n ScreenZone.prototype.getPosition = function() {\n var vec2 = new Proton.Vector3D,\n canvas;\n\n return function() {\n canvas = this.renderer.domElement;\n vec2.x = Math.random() * canvas.width;\n vec2.y = Math.random() * canvas.height;\n this.vector.copy(Proton.THREEUtil.toSpacePos(vec2, this.camera, canvas));\n return this.vector;\n }\n }();\n\n ScreenZone.prototype._dead = function(particle) {\n var pos = Proton.THREEUtil.toScreenPos(particle.p, this.camera, this.renderer.domElement);\n var canvas = this.renderer.domElement;\n\n if ((pos.y + particle.radius < -this.dis) && this.d1) {\n particle.dead = true;\n } else if ((pos.y - particle.radius > canvas.height + this.dis) && this.d3) {\n particle.dead = true;\n }\n\n if ((pos.x + particle.radius < -this.dis) && this.d4) {\n particle.dead = true;\n } else if ((pos.x - particle.radius > canvas.width + this.dis) && this.d2) {\n particle.dead = true;\n }\n }\n\n ScreenZone.prototype._cross = function() {\n var vec2 = new Proton.Vector3D;\n return function(particle) {\n var pos = Proton.THREEUtil.toScreenPos(particle.p, this.camera, this.renderer.domElement);\n var canvas = this.renderer.domElement;\n\n if (pos.y + particle.radius < -this.dis) {\n vec2.x = pos.x;\n vec2.y = canvas.height + this.dis + particle.radius;\n particle.p.y = Proton.THREEUtil.toSpacePos(vec2, this.camera, canvas).y;\n } else if (pos.y - particle.radius > canvas.height + this.dis) {\n vec2.x = pos.x;\n vec2.y = -this.dis - particle.radius;\n particle.p.y = Proton.THREEUtil.toSpacePos(vec2, this.camera, canvas).y;\n }\n\n if (pos.x + particle.radius < -this.dis) {\n vec2.y = pos.y;\n vec2.x = canvas.width + this.dis + particle.radius;\n particle.p.x = Proton.THREEUtil.toSpacePos(vec2, this.camera, canvas).x;\n } else if (pos.x - particle.radius > canvas.width + this.dis) {\n vec2.y = pos.y;\n vec2.x = -this.dis - particle.radius;\n particle.p.x = Proton.THREEUtil.toSpacePos(vec2, this.camera, canvas).x;\n }\n }\n }();\n\n ScreenZone.prototype._bound = function(particle) {\n var pos = Proton.THREEUtil.toScreenPos(particle.p, this.camera, this.renderer.domElement);\n var canvas = this.renderer.domElement;\n\n if (pos.y + particle.radius < -this.dis) {\n particle.v.y *= -1;\n } else if (pos.y - particle.radius > canvas.height + this.dis) {\n particle.v.y *= -1;\n }\n\n if (pos.x + particle.radius < -this.dis) {\n particle.v.y *= -1;\n } else if (pos.x - particle.radius > canvas.width + this.dis) {\n particle.v.y *= -1;\n }\n }\n\n Proton.ScreenZone = ScreenZone;\n\n\n/**\n * You can use this emit particles.\n *\n * This method will console.log the fixed number of your info in updata or requestAnimationFrame\n * \n * use like this Proton.log('+12',mc); log 12 times\n *\n * @class Proton.log\n * @constructor\n * @param {*} logInfo;\n */\n\n var log = function() {\n if (window.console && window.console.trace) {\n var arg = Array.prototype.slice.call(arguments);\n var s1 = arguments[0] + \"\";\n if (s1.indexOf('+') == 0) {\n var n = parseInt(arguments[0]);\n if (log.once < n) {\n arg.shift();\n console.trace.apply(console, arg);\n log.once++;\n }\n } else {\n arg.unshift(\"+15\");\n log.apply(console, arg);\n }\n }\n }\n\n log.once = 0;\n Proton.log = log;\n\n\n\n var Debug = Debug || {\n addEventListener: function(proton, fun) {\n proton.addEventListener(\"PROTON_UPDATE\", function(e) {\n fun(e);\n });\n },\n\n drawZone: function(proton, container, zone) {\n var geometry, material, mesh;\n\n if (zone instanceof Proton.PointZone) {\n geometry = new THREE.SphereGeometry(15);\n } else if (zone instanceof Proton.LineZone) {\n\n } else if (zone instanceof Proton.BoxZone) {\n geometry = new THREE.BoxGeometry(zone.width, zone.height, zone.depth);\n } else if (zone instanceof Proton.SphereZone) {\n geometry = new THREE.SphereGeometry(zone.radius, 10, 10);\n } else if (zone instanceof Proton.MeshZone) {\n //There's an error here but not sure what should be done. Leaving it for now.\n geometry = zone.geometry.geometry.toBufferGeometry();\n\n geometry = new THREE.SphereGeometry(zone.radius, 10, 10);\n }\n\n material = new THREE.MeshBasicMaterial({ color: \"#2194ce\", wireframe: true });\n mesh = new THREE.Mesh(geometry, material);\n container.add(mesh);\n\n this.addEventListener(proton, function(e) {\n mesh.position.set(zone.x, zone.y, zone.z);\n });\n },\n\n drawEmitter: function(proton, container, emitter, color) {\n var geometry = new THREE.OctahedronGeometry(15);\n var material = new THREE.MeshBasicMaterial({ color: color || \"#aaa\", wireframe: true });\n var mesh = new THREE.Mesh(geometry, material);\n container.add(mesh);\n\n this.addEventListener(proton, function() {\n mesh.position.copy(emitter.p);\n mesh.rotation.set(emitter.rotation.x, emitter.rotation.y, emitter.rotation.z);\n });\n },\n\n renderInfo: function() {\n function getCreatedNumber(proton, type) {\n var pool = type == \"material\" ? \"_materialPool\" : \"_targetPool\";\n var renderer = proton.renderers[0];\n return renderer[pool].cID;\n }\n\n function getEmitterPos(proton) {\n var e = proton.emitters[0];\n return Math.round(e.p.x) + \",\" + Math.round(e.p.y) + \",\" + Math.round(e.p.z);\n }\n\n return function(proton, style) {\n this.addInfo(style);\n var str = \"\";\n switch (this._infoType) {\n case 2:\n str += \"emitter:\" + proton.emitters.length + \"<br>\";\n str += \"em speed:\" + proton.emitters[0].cID + \"<br>\";\n str += \"pos:\" + getEmitterPos(proton);\n break;\n\n case 3:\n str += proton.renderers[0].name + \"<br>\";\n str += \"target:\" + getCreatedNumber(proton, \"target\") + \"<br>\";\n str += \"material:\" + getCreatedNumber(proton, \"material\");\n break;\n\n default:\n str += \"particles:\" + proton.getCount() + \"<br>\";\n str += \"pool:\" + proton.pool.getCount() + \"<br>\";\n str += \"total:\" + (proton.getCount() + proton.pool.getCount());\n }\n this._infoCon.innerHTML = str;\n }\n }(),\n\n addInfo: function() {\n return function(style) {\n var self = this;\n if (!this._infoCon) {\n this._infoCon = document.createElement('div');\n this._infoCon.style.cssText = [\n 'position:fixed;bottom:0px;left:0;cursor:pointer;',\n 'opacity:0.9;z-index:10000;padding:10px;font-size:12px;',\n 'width:120px;height:50px;background-color:#002;color:#0ff;'\n ].join('');\n\n this._infoType = 1;\n this._infoCon.addEventListener('click', function(event) {\n self._infoType++;\n if (self._infoType > 3) self._infoType = 1;\n }, false);\n\n var bg, color;\n switch (style) {\n case 2:\n bg = \"#201\";\n color = \"#f08\";\n break;\n\n case 3:\n bg = \"#020\";\n color = \"#0f0\";\n break;\n\n default:\n bg = \"#002\";\n color = \"#0ff\";\n }\n\n this._infoCon.style[\"background-color\"] = bg;\n this._infoCon.style[\"color\"] = color;\n }\n\n if (!this._infoCon.parentNode) document.body.appendChild(this._infoCon);\n }\n }()\n }\n\n Proton.Debug = Debug;\n\nexport { Proton };","import { DiceSFX } from '../DiceSFX.js';\nimport * as THREE from 'three';\nimport { Proton } from '../libs/three.proton.js';\nimport { DiceSFXManager } from './../DiceSFXManager';\n\nexport class PlayAnimationParticleSpiral extends DiceSFX {\n static id = \"PlayAnimationParticleSpiral\";\n static specialEffectName = \"DICESONICE.PlayAnimationParticleSpiral\";\n static sprite = null;\n static dot = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAKQWlDQ1BJQ0MgUHJvZmlsZQAAeAGdlndUU9kWh8+9N73QEiIgJfQaegkg0jtIFQRRiUmAUAKGhCZ2RAVGFBEpVmRUwAFHhyJjRRQLg4Ji1wnyEFDGwVFEReXdjGsJ7601896a/cdZ39nnt9fZZ+9917oAUPyCBMJ0WAGANKFYFO7rwVwSE8vE9wIYEAEOWAHA4WZmBEf4RALU/L09mZmoSMaz9u4ugGS72yy/UCZz1v9/kSI3QyQGAApF1TY8fiYX5QKUU7PFGTL/BMr0lSkyhjEyFqEJoqwi48SvbPan5iu7yZiXJuShGlnOGbw0noy7UN6aJeGjjAShXJgl4GejfAdlvVRJmgDl9yjT0/icTAAwFJlfzOcmoWyJMkUUGe6J8gIACJTEObxyDov5OWieAHimZ+SKBIlJYqYR15hp5ejIZvrxs1P5YjErlMNN4Yh4TM/0tAyOMBeAr2+WRQElWW2ZaJHtrRzt7VnW5mj5v9nfHn5T/T3IevtV8Sbsz55BjJ5Z32zsrC+9FgD2JFqbHbO+lVUAtG0GQOXhrE/vIADyBQC03pzzHoZsXpLE4gwnC4vs7GxzAZ9rLivoN/ufgm/Kv4Y595nL7vtWO6YXP4EjSRUzZUXlpqemS0TMzAwOl89k/fcQ/+PAOWnNycMsnJ/AF/GF6FVR6JQJhIlou4U8gViQLmQKhH/V4X8YNicHGX6daxRodV8AfYU5ULhJB8hvPQBDIwMkbj96An3rWxAxCsi+vGitka9zjzJ6/uf6Hwtcim7hTEEiU+b2DI9kciWiLBmj34RswQISkAd0oAo0gS4wAixgDRyAM3AD3iAAhIBIEAOWAy5IAmlABLJBPtgACkEx2AF2g2pwANSBetAEToI2cAZcBFfADXALDIBHQAqGwUswAd6BaQiC8BAVokGqkBakD5lC1hAbWgh5Q0FQOBQDxUOJkBCSQPnQJqgYKoOqoUNQPfQjdBq6CF2D+qAH0CA0Bv0BfYQRmALTYQ3YALaA2bA7HAhHwsvgRHgVnAcXwNvhSrgWPg63whfhG/AALIVfwpMIQMgIA9FGWAgb8URCkFgkAREha5EipAKpRZqQDqQbuY1IkXHkAwaHoWGYGBbGGeOHWYzhYlZh1mJKMNWYY5hWTBfmNmYQM4H5gqVi1bGmWCesP3YJNhGbjS3EVmCPYFuwl7ED2GHsOxwOx8AZ4hxwfrgYXDJuNa4Etw/XjLuA68MN4SbxeLwq3hTvgg/Bc/BifCG+Cn8cfx7fjx/GvyeQCVoEa4IPIZYgJGwkVBAaCOcI/YQRwjRRgahPdCKGEHnEXGIpsY7YQbxJHCZOkxRJhiQXUiQpmbSBVElqIl0mPSa9IZPJOmRHchhZQF5PriSfIF8lD5I/UJQoJhRPShxFQtlOOUq5QHlAeUOlUg2obtRYqpi6nVpPvUR9Sn0vR5Mzl/OX48mtk6uRa5Xrl3slT5TXl3eXXy6fJ18hf0r+pvy4AlHBQMFTgaOwVqFG4bTCPYVJRZqilWKIYppiiWKD4jXFUSW8koGStxJPqUDpsNIlpSEaQtOledK4tE20Otpl2jAdRzek+9OT6cX0H+i99AllJWVb5SjlHOUa5bPKUgbCMGD4M1IZpYyTjLuMj/M05rnP48/bNq9pXv+8KZX5Km4qfJUilWaVAZWPqkxVb9UU1Z2qbapP1DBqJmphatlq+9Uuq43Pp893ns+dXzT/5PyH6rC6iXq4+mr1w+o96pMamhq+GhkaVRqXNMY1GZpumsma5ZrnNMe0aFoLtQRa5VrntV4wlZnuzFRmJbOLOaGtru2nLdE+pN2rPa1jqLNYZ6NOs84TXZIuWzdBt1y3U3dCT0svWC9fr1HvoT5Rn62fpL9Hv1t/ysDQINpgi0GbwaihiqG/YZ5ho+FjI6qRq9Eqo1qjO8Y4Y7ZxivE+41smsImdSZJJjclNU9jU3lRgus+0zwxr5mgmNKs1u8eisNxZWaxG1qA5wzzIfKN5m/krCz2LWIudFt0WXyztLFMt6ywfWSlZBVhttOqw+sPaxJprXWN9x4Zq42Ozzqbd5rWtqS3fdr/tfTuaXbDdFrtOu8/2DvYi+yb7MQc9h3iHvQ732HR2KLuEfdUR6+jhuM7xjOMHJ3snsdNJp9+dWc4pzg3OowsMF/AX1C0YctFx4bgccpEuZC6MX3hwodRV25XjWuv6zE3Xjed2xG3E3dg92f24+ysPSw+RR4vHlKeT5xrPC16Il69XkVevt5L3Yu9q76c+Oj6JPo0+E752vqt9L/hh/QL9dvrd89fw5/rX+08EOASsCegKpARGBFYHPgsyCRIFdQTDwQHBu4IfL9JfJFzUFgJC/EN2hTwJNQxdFfpzGC4sNKwm7Hm4VXh+eHcELWJFREPEu0iPyNLIR4uNFksWd0bJR8VF1UdNRXtFl0VLl1gsWbPkRoxajCCmPRYfGxV7JHZyqffS3UuH4+ziCuPuLjNclrPs2nK15anLz66QX8FZcSoeGx8d3xD/iRPCqeVMrvRfuXflBNeTu4f7kufGK+eN8V34ZfyRBJeEsoTRRJfEXYljSa5JFUnjAk9BteB1sl/ygeSplJCUoykzqdGpzWmEtPi000IlYYqwK10zPSe9L8M0ozBDuspp1e5VE6JA0ZFMKHNZZruYjv5M9UiMJJslg1kLs2qy3mdHZZ/KUcwR5vTkmuRuyx3J88n7fjVmNXd1Z752/ob8wTXuaw6thdauXNu5Tnddwbrh9b7rj20gbUjZ8MtGy41lG99uit7UUaBRsL5gaLPv5sZCuUJR4b0tzlsObMVsFWzt3WazrWrblyJe0fViy+KK4k8l3JLr31l9V/ndzPaE7b2l9qX7d+B2CHfc3em681iZYlle2dCu4F2t5czyovK3u1fsvlZhW3FgD2mPZI+0MqiyvUqvakfVp+qk6oEaj5rmvep7t+2d2sfb17/fbX/TAY0DxQc+HhQcvH/I91BrrUFtxWHc4azDz+ui6rq/Z39ff0TtSPGRz0eFR6XHwo911TvU1zeoN5Q2wo2SxrHjccdv/eD1Q3sTq+lQM6O5+AQ4ITnx4sf4H++eDDzZeYp9qukn/Z/2ttBailqh1tzWibakNml7THvf6YDTnR3OHS0/m/989Iz2mZqzymdLz5HOFZybOZ93fvJCxoXxi4kXhzpXdD66tOTSna6wrt7LgZevXvG5cqnbvfv8VZerZ645XTt9nX297Yb9jdYeu56WX+x+aem172296XCz/ZbjrY6+BX3n+l37L972un3ljv+dGwOLBvruLr57/17cPel93v3RB6kPXj/Mejj9aP1j7OOiJwpPKp6qP6391fjXZqm99Oyg12DPs4hnj4a4Qy//lfmvT8MFz6nPK0a0RupHrUfPjPmM3Xqx9MXwy4yX0+OFvyn+tveV0auffnf7vWdiycTwa9HrmT9K3qi+OfrW9m3nZOjk03dp76anit6rvj/2gf2h+2P0x5Hp7E/4T5WfjT93fAn88ngmbWbm3/eE8/ul8iYiAAAJwUlEQVR4AeWb2Xbktg5F7ZvOzfj/f5p5cLApbfURilKpyu68BGvRAElM55AsD528vvwL8vb29vpImdfX17dH/J/1rb5eHmrsaqETwPfqTYF/KUI+lIAJ6BnY2VryOiNgt/aRZHwIAQ14AjyyAZx7zHcg2zz3NvsjiHgXAQfABXZPA3omAryqX95DBAR8mnVxtnYBOOCTgD43vT6CZV0b7XDdPeZKtbN8wD5LxEMEWKyq23xqgV7RAkgt4Cs647AHEc+QIICe8GZ+AL6D/V8FstZ19+t1j0D/XbnY67r7l8tyex4hoTDdfwIBnCIC0e5AmR8NY1OTp4MRMKD7INZ9NTmUcROYXCXi9AkEeAoj2Tx2B/vVutZ1+pmDfIokdMB/lQNrXZODdcTYZbZ8HURcIeGUgDUjxRAbRycgbADPBvndzxhz1fYGIMEL+M/ax3aQQ9scxtXWEAhhD31XDgmI0yeJxdAC6YDJxRo6R/cjnjwpNOtJCxANATlcSyLM441gPsCD4d4tmBIQ4BO44AFEA4JFf12DXOi0Z0RIoCQIPglI0H9UTuZoBvFo48vc7CSB9btP4YaAi+CJ68D/X2uA71pCjLlHgOAF/HvlxKYegzng8UPSZv4QCTcEkKGks2vTaIF42gB2fLPaaslIEsxljbwBM/AA/m2ti+7xtTSE2HH1S0OCNnW0y9zLjoA4fbwIdFDUE/DkBY0GMOPbsF3rJBBPvk6A7ztPHsCCp9cEb2+1PCRBYmd+3sL082BHwJrIxGgLSgD+efKCBDjju1U7d98Y4gWSDXJi/fQF/2vteYPsxx5r6+Z0AS8Z+RxcI2aTjYB2+jhYxKLeAGI8fQACejaSBP2J9QaQF6FJhjeAK++1T/AZl+QJmBzYamz8NuCzW7ARUI6IoNUdvCfptffUv69YB2Rg521IAqhJ3gRB094ACQA8cdSU/B7XwXcCJKFSDNnIcGEQcHL6NElRGsCXIRhOPwn4oeaMJEISjDFHBzIjQPDESEAnjbiz4UFuwPstILmis5omBW8D3oAE74lLQCcBkvA3llwzAngCfgDy/vEX/Mw/gRPrIL97AD+9BUlA+Q6RAHSSgC9NeZpHJPxYPnkLniGgg6cPBDACRfts0M7dJwYixLPdglrb5FO7/jp38LAKAZIA+CRAwGpvgU/AG0C8t4kaSIICCLdAvzx5T1WA+qqNY04N/KYk5DOgECLwZfZ5TgKGBMxugJ8DPgVJQEvAvfecoGbgIQkC8EvAfGACnPw+H3q17xmu2v78nUECWEQMQJtE8PgyJCFvQZIA6Bz4dQLITQ2kgxPA0T5A/U5BbmyfjD1Ckv0npptn0AmouCkJJJMIih2RABE5aJC5MdTLxmq6EcAJCx4fpJMjeD4kk1gJyHhyJHjy3UgSkM7aNktiCSBGQBKRH4w0ZnOevDobpAYiSAiwadbzzXvtAW6t7IGeGPZp3+JIPW7B+tn3lgRU/CYZYDKTW8wGbEiQrndtg+bbipUh2E6Kb95cs1r2Y3/mTwxZa2cTrCMb2qlNaAG0Rbu20b6eseQzPzU5kT4nHvDmOcrrfs+fNcyNRtTjJpBgJhmELQmpJUJNrmxEO2O0zU9tGhnNrFof41MnYOvpn9r8aupMJQnAOcXg1FnkzLbp7pO5ZvW6/1Ge7ue855/VkOyBNQkQfAZpp8bOQfGcH9nkzz3mCGtI6vSb2Uc1e56ROHI73zSJ/tMyIyCviHZq7Bx8guf8yIbo3GOO9LWcH9lHNc2XutvMN8knQLGUWXG/Xd3T/mjb/bjOZ3W6/1Ge7ud81nPHlPPxbWa3sE56Iguk9nu0mh9WbDh1xvR3TjlrpR925tCmhnXUPY65OdW1NBduAE6Ip2OQ2gI2gbaRrv2FJNf5JPdDizrk7U+v18h47Fne9MnezGX/qa3P2pB8Aq6hM8iEFrGwTfmLib+ZuU7uI/CdkKxh/EzPatmP/ZkrMSS2nZ0EZIC2yUxusWwum5r9JcfTJif1mB8RQH5zm5ecDtfQ+qHtyz7tWxypy72ue/2XaCXTz4B0NhGa5L1BG8s/YM5O3jzkmN2Knh+A5CbvbFg3iaA38lsLnVhqeit5A9jNABMJXJZh3AZt0l+EZuDJKUD3IcEPRPapYR3zA/yXyZCQToL9dSISU6XbiwTghGRTNm7zJLY5CaCZ/EXl3uleJUBiIeDnGBKSJNCLN+EIfLkMkQznL5/Wt9CBd/CejiTQIGAAn6B83xQwh7ESdUYSBDOOCJAMiIAEbwEx9CYB1PQGCxo9JP/J3BvgHjoDTCIICgGAOAdzh0TO4t5LwE9VBwLyFkDAlRuwgS//nSQB6YQNCAABnpNFSwCFPW214I1N0vDnc0LSiOn+nqCAOGHBevJHJNAXg5oOD4F+ctT0swwC2jNgNwNIJBgap0FBqxOMDfhc8PcvOY8SIAmevETkE5AwCaQ+PSeGmi6S15+VvAHMCVKw+y2AZcB6gtgJXrJoAl+a8/S9AX4GkAMhxjhACIg4P+y8Can9DMC/3wBzJgmJrUIW2Qg4uQUkAySg0DQp8A4+gUgAfyD1/V+5AYKBgCTB2yAp7EkWPXnzOvjaWqSfPqsbAasPKpkiGSIBy2z5muC9LfjTTIL3Z4T8juENIpOxADDWeElQe+oJXsIkQQLQ5HaUeSs7AtotIBCxwWW2kKFtcn0kQCCc0Oz0ZwT0WEkgh4DVnrzgPX30FPjs9AGxI4CFVQCUJ0xShDXApST4PMV+8tTK99/zU8N4CZSEmdbHGOId9KSk7dqmbwiIW9ADJYFgirvPOjaaZhieDPkd/qzA6R/dAOPJ7yCXYNMWONra9kI/jtP/bPaGgAr0NyVOSJAsIxRAct1CNkGz5KVZtMDVCb62h5DDeEkQoESgXUsfbGIZ9qI+BV/+h08gScCPhAqFFBu3AUDaJDYEABjbk5eAfAI9j6AE3QG7b90OvsotBzmMky/TG9D8aa7fhl4wAdCcgAGQwDt4SxGfOQQm0K7dn/VBTnJdEk/h0Hn9R0T38TcGLaDUHbBzY1OTV/CpE2C3JSp15sG+e/VHwCP/21wQkQQkGOwkIufdj3lKgk/bE+46fbCRoY++3S0u+6/8Rag3svdoswMS8JoBPFtrmce0g7o3J+hp8CP4UQLWoCRNO7XAcdfOfdYR1wTBmnaCd90156kvXXkCUh6+AS1YACxrX9WZKu0kgPV786eAW/BdBEQSQbN0xe5+zAWKjeR8aj/y1peUt18/hADTxueDS0nG2Zp76ATr+m7tI4BviZ/5DDD4TE/I0H1GinvoHVg3PhK0OUexL0VAFlkL3QO+C/lSgHdFasIT+AcDVfh0vBU3zQAAAABJRU5ErkJggg==\";\n static sound = \"modules/dice-so-nice/sfx/sounds/doublespiral.mp3\";\n\n /**@override init */\n static async init() {\n let map = await this.loadAsset(DiceSFXManager.TextureLoader, PlayAnimationParticleSpiral.dot);\n let material = new THREE.SpriteMaterial({\n map: map,\n color: 0xff0000,\n blending: THREE.CustomBlending,\n blendSrc: THREE.SrcAlphaFactor,\n blendDst: THREE.OneFactor,\n blendEquation: THREE.AddEquation,\n fog: true\n });\n PlayAnimationParticleSpiral.sprite = new THREE.Sprite(material);\n game.audio.pending.push(function(){\n AudioHelper.preloadSound(PlayAnimationParticleSpiral.sound);\n }.bind(this));\n }\n\n /**@override play */\n async play() {\n this.proton = new Proton();\n this.R = 70;\n this.tha = 0;\n this.emitter1 = this.createEmitter(this.R, this.R, '#4F1500', '#0029FF');\n this.emitter2 = this.createEmitter(-this.R, -this.R, '#004CFE', '#6600FF');\n this.proton.addEmitter(this.emitter1);\n this.proton.addEmitter(this.emitter2);\n this.proton.addRender(new Proton.SpriteRender(this.box.scene));\n\n AudioHelper.play({\n src: PlayAnimationParticleSpiral.sound,\n volume: this.volume\n\t\t}, false);\n this.renderReady = true;\n //Proton.Debug.drawZone(proton,scene,zone2);\n //Proton.Debug.drawEmitter(this.proton,this.box.scene,this.emitter);\n }\n\n createEmitter(x, y, color1, color2) {\n var emitter = new Proton.Emitter();\n emitter.rate = new Proton.Rate(new Proton.Span(5, 7), new Proton.Span(.01, .02));\n emitter.addInitialize(new Proton.Mass(1));\n emitter.addInitialize(new Proton.Life(1));\n emitter.addInitialize(new Proton.Body(PlayAnimationParticleSpiral.sprite));\n emitter.addInitialize(new Proton.Radius(30));\n emitter.addInitialize(new Proton.V(200, new Proton.Vector3D(0, 0, -1), 0));\n\n\n emitter.addBehaviour(new Proton.Alpha(1, 0));\n emitter.addBehaviour(new Proton.Color(color1, color2));\n emitter.addBehaviour(new Proton.Scale(1.5, 0.1));\n //emitter.addBehaviour(new Proton.CrossZone(new Proton.ScreenZone(this.box.camera, this.box.renderer), 'dead'));\n\n emitter.addBehaviour(new Proton.Force(0, 0, 17));\n emitter.p.x = this.dicemesh.parent.position.x + x;\n emitter.p.y = this.dicemesh.parent.position.y + y;\n emitter.p.z = 50;\n emitter.emit(0.7,true);\n return emitter;\n }\n\n animateEmitter() {\n this.tha += .2;\n this.emitter1.p.x = this.dicemesh.parent.position.x + this.R * Math.cos(this.tha);\n this.emitter1.p.y = this.dicemesh.parent.position.y + this.R * Math.sin(this.tha);\n\n this.emitter2.p.x = this.dicemesh.parent.position.x - this.R * Math.cos(this.tha);\n this.emitter2.p.y = this.dicemesh.parent.position.y - this.R * Math.sin(this.tha);\n }\n\n render() {\n if(!this.renderReady)\n return;\n this.animateEmitter();\n this.proton.update();\n if(this.proton.emitters.length == 0){\n this.destroy();\n }\n }\n\n destroy(){\n if(this.emitter1){\n this.emitter1.stopEmit();\n this.emitter1.removeAllParticles();\n } \n \n if(this.emitter2){\n this.emitter2.stopEmit();\n this.emitter2.removeAllParticles();\n }\n this.proton.update();\n this.proton.destroy();\n this.destroyed = true;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\nimport * as THREE from 'three';\nimport { Proton } from '../libs/three.proton.js';\nimport { DiceSFXManager } from './../DiceSFXManager';\n\nexport class PlayAnimationParticleSparkles extends DiceSFX {\n static id = \"PlayAnimationParticleSparkles\";\n static specialEffectName = \"DICESONICE.PlayAnimationParticleSparkles\";\n static sprite = null;\n static sound = \"modules/dice-so-nice/sfx/sounds/sparkles.mp3\";\n /**@override init */\n static async init() {\n let map = await this.loadAsset(DiceSFXManager.TextureLoader, \"modules/dice-so-nice/sfx/textures/glow_point_red_gold.webp\");\n let material = new THREE.SpriteMaterial({\n map: map,\n fog: true,\n blending:THREE.AdditiveBlending,\n depthWrite:false,\n depthTest:true\n });\n PlayAnimationParticleSparkles.sprite = new THREE.Sprite(material);\n game.audio.pending.push(function(){\n AudioHelper.preloadSound(PlayAnimationParticleSparkles.sound);\n }.bind(this));\n }\n\n /**@override play */\n async play() {\n this.proton = new Proton();\n this.emitter = new Proton.Emitter();\n this.emitter.rate = new Proton.Rate(new Proton.Span(350, 450), 0.3);\n this.emitter.addInitialize(new Proton.Mass(1,0.3));\n this.emitter.addInitialize(new Proton.Life(1,3));\n this.emitter.addInitialize(new Proton.Body(PlayAnimationParticleSparkles.sprite));\n this.emitter.addInitialize(new Proton.Radius(100,60));\n this.emitter.addInitialize(new Proton.Position(new Proton.SphereZone(0,0,0,30)));\n this.emitter.addInitialize(new Proton.Velocity(200, new Proton.Vector3D(0, 0, 0), 0));\n\n this.emitter.addBehaviour(new Proton.RandomDrift(10,10,5,0.1,Infinity,Proton.easeOutQuart));\n this.emitter.addBehaviour(new Proton.Alpha(1, 0));\n this.emitter.addBehaviour(new Proton.Scale(1, 0.5));\n\n this.emitter.addBehaviour(new Proton.Force(0, 0, 1));\n\n let parent = null;\n if(this.dicemesh.isMesh){\n parent = this.dicemesh.parent;\n } else {\n parent = this.dicemesh.parent.clone();\n delete parent.children[0].geometry;\n }\n\n this.emitter.p.x = parent.position.x;\n this.emitter.p.y = parent.position.y;\n\n let boundingBox = new THREE.Vector3();\n new THREE.Box3().setFromObject(parent).getSize(boundingBox);\n\n this.emitter.p.z = boundingBox.z/2;\n this.emitter.emit('once',true);\n this.proton.addEmitter(this.emitter);\n this.proton.addRender(new Proton.SpriteRender(this.box.scene));\n\n AudioHelper.play({\n src: PlayAnimationParticleSparkles.sound,\n volume: this.volume\n\t\t}, false);\n this.renderReady = true;\n }\n\n render() {\n if(!this.renderReady)\n return;\n this.proton.update();\n if(this.proton.emitters.length == 0){\n this.destroy();\n }\n }\n\n destroy(){\n if(this.emitter){\n this.emitter.stopEmit();\n this.emitter.removeAllParticles();\n }\n this.proton.update();\n this.proton.destroy();\n this.destroyed = true;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\nimport * as THREE from 'three';\nimport { Proton } from '../libs/three.proton.js';\nimport { DiceSFXManager } from './../DiceSFXManager';\n\nexport class PlayAnimationParticleVortex extends DiceSFX {\n static id = \"PlayAnimationParticleVortex\";\n static specialEffectName = \"DICESONICE.PlayAnimationParticleVortex\";\n static sprite = null;\n static sound = \"modules/dice-so-nice/sfx/sounds/vortex.mp3\";\n /**@override init */\n static async init() {\n let map = await this.loadAsset(DiceSFXManager.TextureLoader, \"modules/dice-so-nice/sfx/textures/magic01.webp\");\n let material = new THREE.MeshBasicMaterial({\n map: map,\n blending:THREE.NormalBlending,\n depthWrite:false,\n depthTest:true,\n transparent:true\n });\n let geometry = new THREE.PlaneGeometry(140,140);\n PlayAnimationParticleVortex.sprite = new THREE.Mesh(geometry,material);\n \n game.audio.pending.push(function(){\n AudioHelper.preloadSound(PlayAnimationParticleVortex.sound);\n }.bind(this));\n }\n\n /**@override play */\n async play() {\n this.proton = new Proton();\n this.emitter = new Proton.Emitter();\n this.emitter.rate = new Proton.Rate(new Proton.Span(6, 8), new Proton.Span(.1, .25));\n this.emitter.addInitialize(new Proton.Mass(1));\n this.emitter.addInitialize(new Proton.Life(0.8,2.4));\n this.emitter.addInitialize(new Proton.Body(PlayAnimationParticleVortex.sprite));\n this.emitter.addInitialize(new Proton.Velocity(50, new Proton.Vector3D(0,0,1), 0));\n let scale = this.box.dicefactory.baseScale/100;\n switch (this.dicemesh.shape) {\n case \"d2\":\n scale *= 1.3;\n break;\n case \"d4\":\n scale *= 1.2;\n break;\n case \"d6\":\n break;\n case \"d8\":\n scale *= 1.2;\n break;\n case \"d10\":\n break;\n case \"d12\":\n scale *= 1.3;\n break;\n case \"d20\":\n scale *= 1.4;\n break;\n }\n this.emitter.addInitialize(new Proton.Radius(scale));\n\n this.emitter.addBehaviour(new Proton.Color(['#1f0e26','#462634','#290088'],'#060206'));\n this.emitter.addBehaviour(new Proton.Alpha(0.7, 0, Infinity, Proton.easeInQuart));\n this.emitter.addBehaviour(new Proton.Scale(0.7, 1.3, Infinity, Proton.easeInSine));\n this.emitter.addBehaviour(new Proton.Rotate(0,0,-3));\n\n this.emitter.p.x = this.dicemesh.parent.position.x;\n this.emitter.p.y = this.dicemesh.parent.position.y;\n\n this.emitter.p.z = -5;\n this.emitter.emit(1.25,true);\n\n this.proton.addEmitter(this.emitter);\n this.proton.addRender(new Proton.MeshRender(this.box.scene));\n\n AudioHelper.play({\n src: PlayAnimationParticleVortex.sound,\n volume: this.volume\n\t\t}, false);\n this.renderReady = true;\n }\n\n render() {\n if(!this.renderReady)\n return;\n this.proton.update();\n if(this.proton.emitters.length == 0){\n this.destroy();\n }\n }\n\n destroy(){\n if(this.emitter){\n this.emitter.stopEmit();\n this.emitter.removeAllParticles();\n }\n this.proton.update();\n this.proton.destroy();\n this.destroyed = true;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\nimport * as THREE from 'three';\nimport { ShaderUtils } from './../ShaderUtils';\n\nexport class PlayAnimationBright extends DiceSFX {\n static id = \"PlayAnimationBright\";\n static specialEffectName = \"DICESONICE.PlayAnimationBright\";\n static brightColor = null;\n static duration = 0.6;\n static sound = \"modules/dice-so-nice/sfx/sounds/bright.mp3\";\n /**@override init */\n static async init() {\n PlayAnimationBright.brightColor = new THREE.Color(0.3,0.3,0.3);\n this.glowingMesh=null;\n game.audio.pending.push(function(){\n AudioHelper.preloadSound(PlayAnimationBright.sound);\n }.bind(this));\n }\n\n /**@override play */\n async play() {\n \n if(!this.dicemesh.material && this.dicemesh.userData.glow){\n //We check if there's a glow target specified\n this.dicemesh.traverse(object => {\n if (object.userData && object.userData.name && object.userData.name === this.dicemesh.userData.glow) this.glowingMesh=object;\n });\n } else if(this.dicemesh.material){\n this.glowingMesh=this.dicemesh;\n } else {\n return false;\n }\n if(!this.glowingMesh.material.emissiveMap)\n return false;\n this.clock = new THREE.Clock();\n this.baseColor = this.glowingMesh.material.emissive.clone();\n this.baseMaterial = this.glowingMesh.material;\n this.glowingMesh.material = this.baseMaterial.clone();\n this.glowingMesh.material.onBeforeCompile = ShaderUtils.applyDiceSoNiceShader;\n AudioHelper.play({\n src: PlayAnimationBright.sound,\n volume: this.volume\n\t\t}, false);\n this.renderReady = true;\n }\n\n render() {\n if(!this.renderReady)\n return;\n let x = 1-((PlayAnimationBright.duration - this.clock.getElapsedTime())/PlayAnimationBright.duration);\n if(x>1){\n this.destroy();\n } else {\n let val = (Math.sin(2 * Math.PI * (x - 1/4)) + 1) / 2;\n this.glowingMesh.material.emissive.copy(this.baseColor);\n this.glowingMesh.material.emissive.lerp(PlayAnimationBright.brightColor, val);\n }\n }\n\n destroy(){\n let sfxMaterial = this.glowingMesh.material;\n this.glowingMesh.material = this.baseMaterial;\n sfxMaterial.dispose();\n this.destroyed = true;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\nimport * as THREE from 'three';\nimport { ShaderUtils } from './../ShaderUtils';\n\nexport class PlayAnimationDark extends DiceSFX {\n static id = \"PlayAnimationDark\";\n static specialEffectName = \"DICESONICE.PlayAnimationDark\";\n static darkColor = null;\n static duration = 1.5;\n static sound = \"modules/dice-so-nice/sfx/sounds/darkness.mp3\";\n /**@override init */\n static async init() {\n PlayAnimationDark.darkColor = new THREE.Color(0.1,0.1,0.1);\n game.audio.pending.push(function(){\n AudioHelper.preloadSound(PlayAnimationDark.sound);\n }.bind(this));\n }\n\n /**@override play */\n async play() {\n if(!this.dicemesh.material && this.dicemesh.userData.glow){\n //We check if there's a glow target specified\n this.dicemesh.traverse(object => {\n if (object.userData && object.userData.name && object.userData.name === this.dicemesh.userData.glow) this.glowingMesh=object;\n });\n } else if(this.dicemesh.material){\n this.glowingMesh=this.dicemesh;\n } else {\n return false;\n }\n this.clock = new THREE.Clock();\n this.baseColor = this.glowingMesh.material.color.clone();\n this.baseMaterial = this.glowingMesh.material;\n this.glowingMesh.material = this.baseMaterial.clone();\n this.glowingMesh.material.onBeforeCompile = ShaderUtils.applyDiceSoNiceShader;\n AudioHelper.play({\n\t\t\tsrc: PlayAnimationDark.sound,\n volume: this.volume\n\t\t}, false);\n this.renderReady = true;\n }\n\n render() {\n if(!this.renderReady)\n return;\n let x = 1-((PlayAnimationDark.duration - this.clock.getElapsedTime())/PlayAnimationDark.duration);\n if(x>1){\n this.destroy();\n } else {\n let val = 0.05172144 + 9.269017*x - 26.55545*x**2 + 26.19969*x**3 - 8.977907*x**4;\n val = Math.min(Math.max(val, 0), 1);\n this.glowingMesh.material.color.copy(this.baseColor);\n this.glowingMesh.material.color.lerp(PlayAnimationDark.darkColor, val);\n }\n }\n\n destroy(){\n let sfxMaterial = this.glowingMesh.material;\n this.glowingMesh.material = this.baseMaterial;\n sfxMaterial.dispose();\n this.destroyed = true;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\nimport * as THREE from 'three';\nimport { DiceSFXManager } from './../DiceSFXManager';\nimport { ShaderUtils } from './../ShaderUtils';\n\n\nexport class PlayAnimationThormund extends DiceSFX {\n static id = \"PlayAnimationThormund\";\n static specialEffectName = \"DICESONICE.PlayAnimationThormund\";\n static file = \"modules/dice-so-nice/sfx/models/thormund.glb\";\n static sound = \"modules/dice-so-nice/sfx/sounds/thormund.mp3\";\n static model = null;\n static curve = null;\n static duration1 = 2.5;\n static duration2 = 2.5;\n static up = new THREE.Vector3(0,0,1);\n /**@override init */\n static async init() {\n game.audio.pending.push(function(){\n AudioHelper.preloadSound(PlayAnimationThormund.sound);\n }.bind(this));\n\n let gltf = await this.loadAsset(DiceSFXManager.GLTFLoader, PlayAnimationThormund.file);\n gltf.scene.traverse(function (node) {\n if (node.isMesh) {\n node.castShadow = true; \n node.material.onBeforeCompile = ShaderUtils.applyDiceSoNiceShader;\n }\n });\n PlayAnimationThormund.model = gltf.scene.children[0];\n }\n\n /**@override play */\n async play() {\n this.step = 1;\n this.clock = new THREE.Clock();\n this.thormund = PlayAnimationThormund.model.clone();\n let scale = this.box.dicefactory.baseScale/100;\n\n let boundingBox = new THREE.Vector3();\n let parent = null;\n if(this.dicemesh.isMesh){\n parent = this.dicemesh.parent;\n } else {\n parent = this.dicemesh.parent.clone();\n delete parent.children[0].geometry;\n }\n new THREE.Box3().setFromObject(parent).getSize(boundingBox);\n \n\t\tthis.thormund.scale.set(scale,scale,scale);\n this.thormund.rotation.x = Math.PI/2;\n this.thormund.position.x = parent.position.x;\n this.thormund.position.y = parent.position.y;\n this.thormund.position.z = parent.position.z + (boundingBox.z/2);\n\n this.curve = new THREE.CatmullRomCurve3( [\n new THREE.Vector3( this.thormund.position.x, this.thormund.position.y,-50),\n new THREE.Vector3( this.thormund.position.x +0, this.thormund.position.y -100, this.thormund.position.z +0 ),\n new THREE.Vector3( this.thormund.position.x +100, this.thormund.position.y -30, this.thormund.position.z +0 ),\n new THREE.Vector3( this.thormund.position.x +100, this.thormund.position.y +30, this.thormund.position.z +0 ),\n new THREE.Vector3( this.thormund.position.x +30, this.thormund.position.y +100, this.thormund.position.z +0 ),\n new THREE.Vector3( this.thormund.position.x -30, this.thormund.position.y +100, this.thormund.position.z +0 ),\n new THREE.Vector3( this.thormund.position.x -100, this.thormund.position.y +30, this.thormund.position.z +80 ),\n new THREE.Vector3( this.thormund.position.x /2, this.thormund.position.y /2, this.thormund.position.z +100 )\n ],false,\"chordal\");\n\n this.curve2 = new THREE.CatmullRomCurve3([\n new THREE.Vector3( this.thormund.position.x /2, this.thormund.position.y /2, this.thormund.position.z +100 ),\n new THREE.Vector3( 100, 50, this.box.camera.position.z/4 ),\n new THREE.Vector3( -100, -50, this.box.camera.position.z/4*2 ),\n new THREE.Vector3( 0, -50, this.box.camera.position.z/4*3 ),\n new THREE.Vector3( 0, 0, this.box.camera.position.z )\n ],false,\"chordal\");\n\n this.axis = new THREE.Vector3();\n this.box.scene.add(this.thormund);\n AudioHelper.play({\n src: PlayAnimationThormund.sound,\n volume: this.volume\n\t\t}, false);\n this.renderReady = true;\n }\n\n render() {\n if(!this.renderReady)\n return;\n let duration = this.step == 1? PlayAnimationThormund.duration1:PlayAnimationThormund.duration2;\n let x = 1-((duration - this.clock.getElapsedTime())/duration);\n if(x>1){\n if(this.step == 1){\n this.step++;\n x = 0;\n this.clock.start();\n this.render();\n }\n else\n this.destroy();\n } else {\n let curve = this.step==1?this.curve:this.curve2;\n let p = curve.getPointAt(x);\n let t = curve.getTangentAt(x).normalize();\n this.axis.crossVectors(PlayAnimationThormund.up, t).normalize();\n let radians = Math.acos(PlayAnimationThormund.up.dot(t));\n\n this.thormund.position.copy(p);\n this.thormund.quaternion.setFromAxisAngle(this.axis,radians);\n }\n }\n\n destroy(){\n this.box.scene.remove(this.thormund);\n this.destroyed = true;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\nimport * as THREE from 'three';\nimport { DiceSFXManager } from './../DiceSFXManager';\n\nexport class PlayAnimationImpact extends DiceSFX {\n static id = \"PlayAnimationImpact\";\n static specialEffectName = \"DICESONICE.PlayAnimationImpact\";\n static sound = \"modules/dice-so-nice/sfx/sounds/hit_glass.mp3\";\n static planeImpact = null;\n static duration = 0.1;\n /**@override constructor */\n constructor(box, dicemesh){\n super(box, dicemesh);\n this.enableGC = true;\n }\n /**@override init */\n static async init() {\n game.audio.pending.push(function () {\n AudioHelper.preloadSound(PlayAnimationImpact.sound);\n }.bind(this));\n \n let data = await this.loadAsset(DiceSFXManager.TextureLoader, \"modules/dice-so-nice/sfx/textures/glassimpact_color.webp\");\n const geometry = new THREE.PlaneGeometry(730, 730);\n const material = new THREE.MeshStandardMaterial({\n map: data,\n transparent: true,\n opacity: 2\n });\n PlayAnimationImpact.planeImpact = new THREE.Mesh(geometry, material);\n }\n\n /**@override play */\n async play() {\n this.clock = new THREE.Clock();\n this.plane = PlayAnimationImpact.planeImpact.clone();\n this.plane.receiveShadow = this.box.shadows;\n\n let scale = this.box.dicefactory.baseScale / 100;\n switch (this.dicemesh.shape) {\n case \"d2\":\n scale *= 1.3;\n break;\n case \"d4\":\n scale *= 1.1;\n break;\n case \"d6\":\n break;\n case \"d8\":\n scale *= 1.1;\n break;\n case \"d10\":\n break;\n case \"d12\":\n scale *= 1.2;\n break;\n case \"d20\":\n scale *= 1.3;\n break;\n }\n this.plane.scale.set(scale, scale, scale);\n\n this.plane.position.x = this.dicemesh.parent.position.x;\n this.plane.position.y = this.dicemesh.parent.position.y;\n this.plane.rotation.z = Math.random() * Math.PI * 2;\n this.box.scene.add(this.plane);\n AudioHelper.play({\n src: PlayAnimationImpact.sound,\n volume: this.volume\n }, false);\n this.dicemesh.position.z -= 1;\n\n }\n\n destroy() {\n this.box.scene.remove(this.plane);\n this.destroyed = true;\n }\n}","import * as THREE from 'three';\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\n\nimport { PlaySoundEpicFail } from './sfx/PlaySoundEpicFail.js';\nimport { PlaySoundEpicWin } from './sfx/PlaySoundEpicWin.js';\nimport { PlaySoundCustom } from './sfx/PlaySoundCustom.js';\nimport { PlayConfettiStrength1 } from './sfx/PlayConfettiStrength1.js';\nimport { PlayConfettiStrength2 } from './sfx/PlayConfettiStrength2.js';\nimport { PlayConfettiStrength3 } from './sfx/PlayConfettiStrength3.js';\nimport { PlayAnimationParticleSpiral } from './sfx/PlayAnimationParticleSpiral.js';\nimport { PlayAnimationParticleSparkles } from './sfx/PlayAnimationParticleSparkles.js';\nimport { PlayAnimationParticleVortex } from './sfx/PlayAnimationParticleVortex.js';\nimport { PlayAnimationBright } from './sfx/PlayAnimationBright.js';\nimport { PlayAnimationDark } from './sfx/PlayAnimationDark.js';\nimport { PlayAnimationThormund } from './sfx/PlayAnimationThormund.js';\nimport { PlayAnimationImpact } from './sfx/PlayAnimationImpact.js';\nimport { PlayMacro } from './sfx/PlayMacro.js';\nimport { PlayAnimationOutline } from './sfx/PlayAnimationOutline.js';\n\nexport const DiceSFXManager = {\n SFX_MODE_CLASS : {\n \"PlayAnimationBright\": PlayAnimationBright,\n \"PlayAnimationDark\": PlayAnimationDark,\n \"PlayAnimationOutline\": PlayAnimationOutline,\n \"PlayAnimationImpact\": PlayAnimationImpact,\n \"PlayConfettiStrength1\": PlayConfettiStrength1,\n \"PlayConfettiStrength2\": PlayConfettiStrength2,\n \"PlayConfettiStrength3\": PlayConfettiStrength3,\n \"PlayAnimationThormund\": PlayAnimationThormund,\n \"PlayAnimationParticleSpiral\": PlayAnimationParticleSpiral,\n \"PlayAnimationParticleSparkles\": PlayAnimationParticleSparkles,\n \"PlayAnimationParticleVortex\": PlayAnimationParticleVortex,\n \"PlaySoundEpicWin\": PlaySoundEpicWin,\n \"PlaySoundEpicFail\": PlaySoundEpicFail,\n \"PlaySoundCustom\": PlaySoundCustom,\n \"PlayMacro\": PlayMacro\n },\n SFX_MODE_LIST : null,\n SFX_CLASS : {},\n EXTRA_TRIGGER_TYPE : [],\n EXTRA_TRIGGER_RESULTS : {},\n renderQueue : [],\n garbageCollector : [],\n GLTFLoader : null,\n TextureLoader: null,\n init : function(){\n if(!DiceSFXManager.SFX_MODE_LIST){\n DiceSFXManager.SFX_MODE_LIST = {};\n Object.values(DiceSFXManager.SFX_MODE_CLASS).forEach((sfx)=>{\n if(sfx.id.startsWith(\"PlayConfettiStrength\") && (!game.modules.get(\"confetti\") || !game.modules.get(\"confetti\").active))\n return;\n DiceSFXManager.SFX_MODE_LIST[sfx.id] = sfx.specialEffectName;\n });\n }\n\n DiceSFXManager.GLTFLoader = new GLTFLoader();\n DiceSFXManager.TextureLoader = new THREE.TextureLoader();\n\n let sfxUniqueList = [];\n game.users.forEach((user) => {\n let sfxList = user.getFlag(\"dice-so-nice\", \"sfxList\");\n if(sfxList){\n Object.values(sfxList).forEach((line) => {\n if(line.specialEffect && !Array.isArray(line.specialEffect)){\n sfxUniqueList.push(line.specialEffect);\n } \n });\n }\n });\n //remove duplicate\n sfxUniqueList = sfxUniqueList.filter((v, i, a) => a.indexOf(v) === i);\n\n //for each possible sfx, initialize\n sfxUniqueList.forEach((sfxClassName) => {\n if(sfxClassName.startsWith(\"PlayConfettiStrength\") && (!game.modules.get(\"confetti\") || !game.modules.get(\"confetti\").active))\n return;\n DiceSFXManager.addSFXMode(DiceSFXManager.SFX_MODE_CLASS[sfxClassName]);\n });\n },\n addSFXMode : async function(sfx){\n if(sfx.id && sfx.specialEffectName && !sfx.initialized){\n DiceSFXManager.SFX_CLASS[sfx.id] = sfx;\n sfx.initialized = true;\n await sfx.init();\n }\n },\n playSFX : async function(sfx, box, dicemesh){\n let id = sfx.specialEffect;\n return new Promise(async (resolve)=>{\n if(!DiceSFXManager.SFX_CLASS[id]){\n if(DiceSFXManager.SFX_MODE_CLASS[id]){\n await DiceSFXManager.addSFXMode(DiceSFXManager.SFX_MODE_CLASS[id]);\n } else {\n return;\n }\n }\n \n let sfxInstance = new DiceSFXManager.SFX_CLASS[id](box, dicemesh, sfx.options);\n\n sfxInstance.play(sfx.options).then(result => {\n if(result !== false){\n if(typeof sfxInstance.render === 'function')\n DiceSFXManager.renderQueue.push(sfxInstance);\n if(sfxInstance.enableGC)\n DiceSFXManager.garbageCollector.push(sfxInstance);\n }\n resolve();\n });\n });\n },\n renderSFX : function(){\n let queue = [...DiceSFXManager.renderQueue];\n for(let i =0;i<queue.length;i++){\n let sfxInstance = queue[i];\n if(sfxInstance.destroyed){\n DiceSFXManager.endSFX(sfxInstance);\n } else {\n if(typeof sfxInstance.render === 'function')\n sfxInstance.render();\n }\n }\n },\n endSFX : function(sfxInstance){\n let index = DiceSFXManager.renderQueue.indexOf(sfxInstance);\n if(index !== -1)\n DiceSFXManager.renderQueue.splice(index, 1);\n if(DiceSFXManager.renderQueue.length == 0)\n game.dice3d._afterShow();\n },\n clearQueue : function(){\n let queue = [...DiceSFXManager.renderQueue];\n for(let i =0;i<queue.length;i++){\n let sfxInstance = queue[i];\n if(typeof sfxInstance.destroy === 'function')\n sfxInstance.destroy();\n DiceSFXManager.endSFX(sfxInstance);\n }\n //For animations that do not have a render loop but still require some cleaning\n for(let i = 0;i<DiceSFXManager.garbageCollector.length;i++){\n DiceSFXManager.garbageCollector[i].destroy();\n }\n DiceSFXManager.garbageCollector = [];\n }\n}","import { DiceSFX } from '../DiceSFX.js';\n\nexport class PlayAnimationOutline extends DiceSFX {\n static id = \"PlayAnimationOutline\";\n static specialEffectName = \"DICESONICE.PlayAnimationOutline\";\n\n /**@override play */\n async play() {\n this.box.outlinePass.selectedObjects.push(this.dicemesh);\n }\n\n destroy(){\n this.box.outlinePass.selectedObjects = this.box.outlinePass.selectedObjects.filter(obj => obj != this.dicemesh);\n this.destroyed = true;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\n\nexport class PlayConfettiStrength1 extends DiceSFX {\n static id = \"PlayConfettiStrength1\";\n static specialEffectName = \"DICESONICE.PlayConfettiStrength1\";\n\n /**@override play */\n async play(){\n const strength = window.confetti.confettiStrength.low;\n const shootConfettiProps = window.confetti.getShootConfettiProps(strength);\n\n window.confetti.handleShootConfetti(shootConfettiProps);\n }\n}","import { DiceSFX } from '../DiceSFX.js';\n\nexport class PlayConfettiStrength2 extends DiceSFX {\n static id = \"PlayConfettiStrength2\";\n static specialEffectName = \"DICESONICE.PlayConfettiStrength2\";\n\n /**@override play */\n async play(){\n const strength = window.confetti.confettiStrength.med;\n const shootConfettiProps = window.confetti.getShootConfettiProps(strength);\n\n window.confetti.handleShootConfetti(shootConfettiProps);\n }\n}","import { DiceSFX } from '../DiceSFX.js';\n\nexport class PlayConfettiStrength3 extends DiceSFX {\n static id = \"PlayConfettiStrength3\";\n static specialEffectName = \"DICESONICE.PlayConfettiStrength3\";\n\n /**@override play */\n async play(){\n const strength = window.confetti.confettiStrength.high;\n const shootConfettiProps = window.confetti.getShootConfettiProps(strength);\n\n window.confetti.handleShootConfetti(shootConfettiProps);\n }\n}","import { DiceSFX } from '../DiceSFX.js';\n\n/**\n * Options needed: path\n */\nexport class PlaySoundCustom extends DiceSFX {\n static id = \"PlaySoundCustom\";\n static specialEffectName = \"DICESONICE.PlaySoundCustom\";\n\n /**@override play */\n async play(options){\n if(options && options.path){\n AudioHelper.play({\n src: options.path,\n volume: this.volume\n }, false);\n }\n }\n\n static getDialogContent(sfxLine,id){\n let dialogContent = super.getDialogContent(sfxLine,id);\n\n dialogContent.content = dialogContent.content.concat(`<div class=\"form-group\">\n <label>{{localize \"DICESONICE.sfxOptionsCustomSound\"}}</label>\n <div class=\"form-fields\">\n <button type=\"button\" class=\"file-picker\" data-type=\"audio\" data-target=\"sfxLine[{{id}}][options][path]\" title=\"Browse Files\" tabindex=\"-1\">\n <i class=\"fas fa-file-import fa-fw\"></i>\n </button>\n <input class=\"image\" type=\"text\" name=\"sfxLine[{{id}}][options][path]\" placeholder=\"path/audio.mp3\" value=\"{{path}}\">\n </div>\n </div>`);\n\n dialogContent.data.path = sfxLine.options ? sfxLine.options.path:\"\";\n return dialogContent;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\n\n/**\n * Options needed: macro ID\n */\nexport class PlayMacro extends DiceSFX {\n static id = \"PlayMacro\";\n static specialEffectName = \"DICESONICE.PlayMacro\";\n\n /**@override play */\n async play(options){\n let macro = game.macros.get(options.macroId);\n if(macro)\n macro.execute();\n }\n\n static getDialogContent(sfxLine,id){\n let dialogContent = super.getDialogContent(sfxLine,id);\n\n dialogContent.content = dialogContent.content.concat(`<div class=\"form-group\">\n <label>{{localize \"DICESONICE.sfxOptionsMacro\"}}</label>\n <div class=\"form-fields\">\n <select name=\"sfxLine[{{id}}][options][macroId]\">\n {{selectOptions macroList nameAttr=\"id\" labelAttr=\"name\" selected=macroId}}\n </select>\n </div>\n </div>`);\n\n let permissionLevel = CONST.DOCUMENT_PERMISSION_LEVELS ? CONST.DOCUMENT_PERMISSION_LEVELS.OBSERVER : CONST.ENTITY_PERMISSIONS.OBSERVER;\n \n dialogContent.data.macroList = game.macros.filter(macro => macro.testUserPermission(game.user, permissionLevel)).map(macro => {return {id:macro.id,name:macro.name}});\n \n dialogContent.data.macroList.sort((a, b) => a.name > b.name && 1 || -1);\n dialogContent.data.macroId = sfxLine.options?sfxLine.options.macroId:null;\n return dialogContent;\n }\n}","import {\n\tDataTextureLoader,\n\tDataUtils,\n\tFloatType,\n\tHalfFloatType,\n\tLinearFilter,\n\tLinearSRGBColorSpace\n} from 'three';\n\n// https://github.com/mrdoob/three.js/issues/5552\n// http://en.wikipedia.org/wiki/RGBE_image_format\n\nclass RGBELoader extends DataTextureLoader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.type = HalfFloatType;\n\n\t}\n\n\t// adapted from http://www.graphics.cornell.edu/~bjw/rgbe.html\n\n\tparse( buffer ) {\n\n\t\tconst\n\t\t\t/* default error routine. change this to change error handling */\n\t\t\trgbe_read_error = 1,\n\t\t\trgbe_write_error = 2,\n\t\t\trgbe_format_error = 3,\n\t\t\trgbe_memory_error = 4,\n\t\t\trgbe_error = function ( rgbe_error_code, msg ) {\n\n\t\t\t\tswitch ( rgbe_error_code ) {\n\n\t\t\t\t\tcase rgbe_read_error: throw new Error( 'THREE.RGBELoader: Read Error: ' + ( msg || '' ) );\n\t\t\t\t\tcase rgbe_write_error: throw new Error( 'THREE.RGBELoader: Write Error: ' + ( msg || '' ) );\n\t\t\t\t\tcase rgbe_format_error: throw new Error( 'THREE.RGBELoader: Bad File Format: ' + ( msg || '' ) );\n\t\t\t\t\tdefault:\n\t\t\t\t\tcase rgbe_memory_error: throw new Error( 'THREE.RGBELoader: Memory Error: ' + ( msg || '' ) );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\t/* offsets to red, green, and blue components in a data (float) pixel */\n\t\t\t//RGBE_DATA_RED = 0,\n\t\t\t//RGBE_DATA_GREEN = 1,\n\t\t\t//RGBE_DATA_BLUE = 2,\n\n\t\t\t/* number of floats per pixel, use 4 since stored in rgba image format */\n\t\t\t//RGBE_DATA_SIZE = 4,\n\n\t\t\t/* flags indicating which fields in an rgbe_header_info are valid */\n\t\t\tRGBE_VALID_PROGRAMTYPE = 1,\n\t\t\tRGBE_VALID_FORMAT = 2,\n\t\t\tRGBE_VALID_DIMENSIONS = 4,\n\n\t\t\tNEWLINE = '\\n',\n\n\t\t\tfgets = function ( buffer, lineLimit, consume ) {\n\n\t\t\t\tconst chunkSize = 128;\n\n\t\t\t\tlineLimit = ! lineLimit ? 1024 : lineLimit;\n\t\t\t\tlet p = buffer.pos,\n\t\t\t\t\ti = - 1, len = 0, s = '',\n\t\t\t\t\tchunk = String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) );\n\n\t\t\t\twhile ( ( 0 > ( i = chunk.indexOf( NEWLINE ) ) ) && ( len < lineLimit ) && ( p < buffer.byteLength ) ) {\n\n\t\t\t\t\ts += chunk; len += chunk.length;\n\t\t\t\t\tp += chunkSize;\n\t\t\t\t\tchunk += String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( - 1 < i ) {\n\n\t\t\t\t\t/*for (i=l-1; i>=0; i--) {\n\t\t\t\t\t\tbyteCode = m.charCodeAt(i);\n\t\t\t\t\t\tif (byteCode > 0x7f && byteCode <= 0x7ff) byteLen++;\n\t\t\t\t\t\telse if (byteCode > 0x7ff && byteCode <= 0xffff) byteLen += 2;\n\t\t\t\t\t\tif (byteCode >= 0xDC00 && byteCode <= 0xDFFF) i--; //trail surrogate\n\t\t\t\t\t}*/\n\t\t\t\t\tif ( false !== consume ) buffer.pos += len + i + 1;\n\t\t\t\t\treturn s + chunk.slice( 0, i );\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t},\n\n\t\t\t/* minimal header reading. modify if you want to parse more information */\n\t\t\tRGBE_ReadHeader = function ( buffer ) {\n\n\n\t\t\t\t// regexes to parse header info fields\n\t\t\t\tconst magic_token_re = /^#\\?(\\S+)/,\n\t\t\t\t\tgamma_re = /^\\s*GAMMA\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n\t\t\t\t\texposure_re = /^\\s*EXPOSURE\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n\t\t\t\t\tformat_re = /^\\s*FORMAT=(\\S+)\\s*$/,\n\t\t\t\t\tdimensions_re = /^\\s*\\-Y\\s+(\\d+)\\s+\\+X\\s+(\\d+)\\s*$/,\n\n\t\t\t\t\t// RGBE format header struct\n\t\t\t\t\theader = {\n\n\t\t\t\t\t\tvalid: 0, /* indicate which fields are valid */\n\n\t\t\t\t\t\tstring: '', /* the actual header string */\n\n\t\t\t\t\t\tcomments: '', /* comments found in header */\n\n\t\t\t\t\t\tprogramtype: 'RGBE', /* listed at beginning of file to identify it after \"#?\". defaults to \"RGBE\" */\n\n\t\t\t\t\t\tformat: '', /* RGBE format, default 32-bit_rle_rgbe */\n\n\t\t\t\t\t\tgamma: 1.0, /* image has already been gamma corrected with given gamma. defaults to 1.0 (no correction) */\n\n\t\t\t\t\t\texposure: 1.0, /* a value of 1.0 in an image corresponds to <exposure> watts/steradian/m^2. defaults to 1.0 */\n\n\t\t\t\t\t\twidth: 0, height: 0 /* image dimensions, width/height */\n\n\t\t\t\t\t};\n\n\t\t\t\tlet line, match;\n\n\t\t\t\tif ( buffer.pos >= buffer.byteLength || ! ( line = fgets( buffer ) ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_read_error, 'no header found' );\n\n\t\t\t\t}\n\n\t\t\t\t/* if you want to require the magic token then uncomment the next line */\n\t\t\t\tif ( ! ( match = line.match( magic_token_re ) ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_format_error, 'bad initial token' );\n\n\t\t\t\t}\n\n\t\t\t\theader.valid |= RGBE_VALID_PROGRAMTYPE;\n\t\t\t\theader.programtype = match[ 1 ];\n\t\t\t\theader.string += line + '\\n';\n\n\t\t\t\twhile ( true ) {\n\n\t\t\t\t\tline = fgets( buffer );\n\t\t\t\t\tif ( false === line ) break;\n\t\t\t\t\theader.string += line + '\\n';\n\n\t\t\t\t\tif ( '#' === line.charAt( 0 ) ) {\n\n\t\t\t\t\t\theader.comments += line + '\\n';\n\t\t\t\t\t\tcontinue; // comment line\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( gamma_re ) ) {\n\n\t\t\t\t\t\theader.gamma = parseFloat( match[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( exposure_re ) ) {\n\n\t\t\t\t\t\theader.exposure = parseFloat( match[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( format_re ) ) {\n\n\t\t\t\t\t\theader.valid |= RGBE_VALID_FORMAT;\n\t\t\t\t\t\theader.format = match[ 1 ];//'32-bit_rle_rgbe';\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( dimensions_re ) ) {\n\n\t\t\t\t\t\theader.valid |= RGBE_VALID_DIMENSIONS;\n\t\t\t\t\t\theader.height = parseInt( match[ 1 ], 10 );\n\t\t\t\t\t\theader.width = parseInt( match[ 2 ], 10 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( header.valid & RGBE_VALID_FORMAT ) && ( header.valid & RGBE_VALID_DIMENSIONS ) ) break;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! ( header.valid & RGBE_VALID_FORMAT ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_format_error, 'missing format specifier' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! ( header.valid & RGBE_VALID_DIMENSIONS ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_format_error, 'missing image size specifier' );\n\n\t\t\t\t}\n\n\t\t\t\treturn header;\n\n\t\t\t},\n\n\t\t\tRGBE_ReadPixels_RLE = function ( buffer, w, h ) {\n\n\t\t\t\tconst scanline_width = w;\n\n\t\t\t\tif (\n\t\t\t\t\t// run length encoding is not allowed so read flat\n\t\t\t\t\t( ( scanline_width < 8 ) || ( scanline_width > 0x7fff ) ) ||\n\t\t\t\t\t// this file is not run length encoded\n\t\t\t\t\t( ( 2 !== buffer[ 0 ] ) || ( 2 !== buffer[ 1 ] ) || ( buffer[ 2 ] & 0x80 ) )\n\t\t\t\t) {\n\n\t\t\t\t\t// return the flat buffer\n\t\t\t\t\treturn new Uint8Array( buffer );\n\n\t\t\t\t}\n\n\t\t\t\tif ( scanline_width !== ( ( buffer[ 2 ] << 8 ) | buffer[ 3 ] ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_format_error, 'wrong scanline width' );\n\n\t\t\t\t}\n\n\t\t\t\tconst data_rgba = new Uint8Array( 4 * w * h );\n\n\t\t\t\tif ( ! data_rgba.length ) {\n\n\t\t\t\t\trgbe_error( rgbe_memory_error, 'unable to allocate buffer space' );\n\n\t\t\t\t}\n\n\t\t\t\tlet offset = 0, pos = 0;\n\n\t\t\t\tconst ptr_end = 4 * scanline_width;\n\t\t\t\tconst rgbeStart = new Uint8Array( 4 );\n\t\t\t\tconst scanline_buffer = new Uint8Array( ptr_end );\n\t\t\t\tlet num_scanlines = h;\n\n\t\t\t\t// read in each successive scanline\n\t\t\t\twhile ( ( num_scanlines > 0 ) && ( pos < buffer.byteLength ) ) {\n\n\t\t\t\t\tif ( pos + 4 > buffer.byteLength ) {\n\n\t\t\t\t\t\trgbe_error( rgbe_read_error );\n\n\t\t\t\t\t}\n\n\t\t\t\t\trgbeStart[ 0 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 1 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 2 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 3 ] = buffer[ pos ++ ];\n\n\t\t\t\t\tif ( ( 2 != rgbeStart[ 0 ] ) || ( 2 != rgbeStart[ 1 ] ) || ( ( ( rgbeStart[ 2 ] << 8 ) | rgbeStart[ 3 ] ) != scanline_width ) ) {\n\n\t\t\t\t\t\trgbe_error( rgbe_format_error, 'bad rgbe scanline format' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// read each of the four channels for the scanline into the buffer\n\t\t\t\t\t// first red, then green, then blue, then exponent\n\t\t\t\t\tlet ptr = 0, count;\n\n\t\t\t\t\twhile ( ( ptr < ptr_end ) && ( pos < buffer.byteLength ) ) {\n\n\t\t\t\t\t\tcount = buffer[ pos ++ ];\n\t\t\t\t\t\tconst isEncodedRun = count > 128;\n\t\t\t\t\t\tif ( isEncodedRun ) count -= 128;\n\n\t\t\t\t\t\tif ( ( 0 === count ) || ( ptr + count > ptr_end ) ) {\n\n\t\t\t\t\t\t\trgbe_error( rgbe_format_error, 'bad scanline data' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( isEncodedRun ) {\n\n\t\t\t\t\t\t\t// a (encoded) run of the same value\n\t\t\t\t\t\t\tconst byteValue = buffer[ pos ++ ];\n\t\t\t\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\t\t\t\tscanline_buffer[ ptr ++ ] = byteValue;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t//ptr += count;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// a literal-run\n\t\t\t\t\t\t\tscanline_buffer.set( buffer.subarray( pos, pos + count ), ptr );\n\t\t\t\t\t\t\tptr += count; pos += count;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\t// now convert data from buffer into rgba\n\t\t\t\t\t// first red, then green, then blue, then exponent (alpha)\n\t\t\t\t\tconst l = scanline_width; //scanline_buffer.byteLength;\n\t\t\t\t\tfor ( let i = 0; i < l; i ++ ) {\n\n\t\t\t\t\t\tlet off = 0;\n\t\t\t\t\t\tdata_rgba[ offset ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 1 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 2 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 3 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toffset += 4;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tnum_scanlines --;\n\n\t\t\t\t}\n\n\t\t\t\treturn data_rgba;\n\n\t\t\t};\n\n\t\tconst RGBEByteToRGBFloat = function ( sourceArray, sourceOffset, destArray, destOffset ) {\n\n\t\t\tconst e = sourceArray[ sourceOffset + 3 ];\n\t\t\tconst scale = Math.pow( 2.0, e - 128.0 ) / 255.0;\n\n\t\t\tdestArray[ destOffset + 0 ] = sourceArray[ sourceOffset + 0 ] * scale;\n\t\t\tdestArray[ destOffset + 1 ] = sourceArray[ sourceOffset + 1 ] * scale;\n\t\t\tdestArray[ destOffset + 2 ] = sourceArray[ sourceOffset + 2 ] * scale;\n\t\t\tdestArray[ destOffset + 3 ] = 1;\n\n\t\t};\n\n\t\tconst RGBEByteToRGBHalf = function ( sourceArray, sourceOffset, destArray, destOffset ) {\n\n\t\t\tconst e = sourceArray[ sourceOffset + 3 ];\n\t\t\tconst scale = Math.pow( 2.0, e - 128.0 ) / 255.0;\n\n\t\t\t// clamping to 65504, the maximum representable value in float16\n\t\t\tdestArray[ destOffset + 0 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 0 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 1 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 1 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 2 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 2 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 3 ] = DataUtils.toHalfFloat( 1 );\n\n\t\t};\n\n\t\tconst byteArray = new Uint8Array( buffer );\n\t\tbyteArray.pos = 0;\n\t\tconst rgbe_header_info = RGBE_ReadHeader( byteArray );\n\n\t\tconst w = rgbe_header_info.width,\n\t\t\th = rgbe_header_info.height,\n\t\t\timage_rgba_data = RGBE_ReadPixels_RLE( byteArray.subarray( byteArray.pos ), w, h );\n\n\n\t\tlet data, type;\n\t\tlet numElements;\n\n\t\tswitch ( this.type ) {\n\n\t\t\tcase FloatType:\n\n\t\t\t\tnumElements = image_rgba_data.length / 4;\n\t\t\t\tconst floatArray = new Float32Array( numElements * 4 );\n\n\t\t\t\tfor ( let j = 0; j < numElements; j ++ ) {\n\n\t\t\t\t\tRGBEByteToRGBFloat( image_rgba_data, j * 4, floatArray, j * 4 );\n\n\t\t\t\t}\n\n\t\t\t\tdata = floatArray;\n\t\t\t\ttype = FloatType;\n\t\t\t\tbreak;\n\n\t\t\tcase HalfFloatType:\n\n\t\t\t\tnumElements = image_rgba_data.length / 4;\n\t\t\t\tconst halfArray = new Uint16Array( numElements * 4 );\n\n\t\t\t\tfor ( let j = 0; j < numElements; j ++ ) {\n\n\t\t\t\t\tRGBEByteToRGBHalf( image_rgba_data, j * 4, halfArray, j * 4 );\n\n\t\t\t\t}\n\n\t\t\t\tdata = halfArray;\n\t\t\t\ttype = HalfFloatType;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tthrow new Error( 'THREE.RGBELoader: Unsupported type: ' + this.type );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\treturn {\n\t\t\twidth: w, height: h,\n\t\t\tdata: data,\n\t\t\theader: rgbe_header_info.string,\n\t\t\tgamma: rgbe_header_info.gamma,\n\t\t\texposure: rgbe_header_info.exposure,\n\t\t\ttype: type\n\t\t};\n\n\t}\n\n\tsetDataType( value ) {\n\n\t\tthis.type = value;\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tfunction onLoadCallback( texture, texData ) {\n\n\t\t\tswitch ( texture.type ) {\n\n\t\t\t\tcase FloatType:\n\t\t\t\tcase HalfFloatType:\n\n\t\t\t\t\ttexture.colorSpace = LinearSRGBColorSpace;\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\t\ttexture.magFilter = LinearFilter;\n\t\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\t\ttexture.flipY = true;\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}\n\n\t\treturn super.load( url, onLoadCallback, onProgress, onError );\n\n\t}\n\n}\n\nexport { RGBELoader };\n","/**\n * Full-screen textured quad shader\n */\n\nconst CopyShader = {\n\n\tname: 'CopyShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'opacity': { value: 1.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float opacity;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor = opacity * texel;\n\n\n\t\t}`\n\n};\n\nexport { CopyShader };\n","import {\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tOrthographicCamera,\n\tMesh\n} from 'three';\n\nclass Pass {\n\n\tconstructor() {\n\n\t\tthis.isPass = true;\n\n\t\t// if set to true, the pass is processed by the composer\n\t\tthis.enabled = true;\n\n\t\t// if set to true, the pass indicates to swap read and write buffer after rendering\n\t\tthis.needsSwap = true;\n\n\t\t// if set to true, the pass clears its buffer before rendering\n\t\tthis.clear = false;\n\n\t\t// if set to true, the result of the pass is rendered to screen. This is set automatically by EffectComposer.\n\t\tthis.renderToScreen = false;\n\n\t}\n\n\tsetSize( /* width, height */ ) {}\n\n\trender( /* renderer, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\tconsole.error( 'THREE.Pass: .render() must be implemented in derived pass.' );\n\n\t}\n\n\tdispose() {}\n\n}\n\n// Helper for passes that need to fill the viewport with a single quad.\n\nconst _camera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n// https://github.com/mrdoob/three.js/pull/21358\n\nclass FullscreenTriangleGeometry extends BufferGeometry {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( [ - 1, 3, 0, - 1, - 1, 0, 3, - 1, 0 ], 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( [ 0, 2, 0, 0, 2, 0 ], 2 ) );\n\n\t}\n\n}\n\nconst _geometry = new FullscreenTriangleGeometry();\n\nclass FullScreenQuad {\n\n\tconstructor( material ) {\n\n\t\tthis._mesh = new Mesh( _geometry, material );\n\n\t}\n\n\tdispose() {\n\n\t\tthis._mesh.geometry.dispose();\n\n\t}\n\n\trender( renderer ) {\n\n\t\trenderer.render( this._mesh, _camera );\n\n\t}\n\n\tget material() {\n\n\t\treturn this._mesh.material;\n\n\t}\n\n\tset material( value ) {\n\n\t\tthis._mesh.material = value;\n\n\t}\n\n}\n\nexport { Pass, FullScreenQuad };\n","import {\n\tShaderMaterial,\n\tUniformsUtils\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\n\nclass ShaderPass extends Pass {\n\n\tconstructor( shader, textureID ) {\n\n\t\tsuper();\n\n\t\tthis.textureID = ( textureID !== undefined ) ? textureID : 'tDiffuse';\n\n\t\tif ( shader instanceof ShaderMaterial ) {\n\n\t\t\tthis.uniforms = shader.uniforms;\n\n\t\t\tthis.material = shader;\n\n\t\t} else if ( shader ) {\n\n\t\t\tthis.uniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t\tthis.material = new ShaderMaterial( {\n\n\t\t\t\tname: ( shader.name !== undefined ) ? shader.name : 'unspecified',\n\t\t\t\tdefines: Object.assign( {}, shader.defines ),\n\t\t\t\tuniforms: this.uniforms,\n\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\tfragmentShader: shader.fragmentShader\n\n\t\t\t} );\n\n\t\t}\n\n\t\tthis.fsQuad = new FullScreenQuad( this.material );\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].value = readBuffer.texture;\n\n\t\t}\n\n\t\tthis.fsQuad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( writeBuffer );\n\t\t\t// TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600\n\t\t\tif ( this.clear ) renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tthis.material.dispose();\n\n\t\tthis.fsQuad.dispose();\n\n\t}\n\n}\n\nexport { ShaderPass };\n","import { Pass } from './Pass.js';\n\nclass MaskPass extends Pass {\n\n\tconstructor( scene, camera ) {\n\n\t\tsuper();\n\n\t\tthis.scene = scene;\n\t\tthis.camera = camera;\n\n\t\tthis.clear = true;\n\t\tthis.needsSwap = false;\n\n\t\tthis.inverse = false;\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tconst context = renderer.getContext();\n\t\tconst state = renderer.state;\n\n\t\t// don't update color or depth\n\n\t\tstate.buffers.color.setMask( false );\n\t\tstate.buffers.depth.setMask( false );\n\n\t\t// lock buffers\n\n\t\tstate.buffers.color.setLocked( true );\n\t\tstate.buffers.depth.setLocked( true );\n\n\t\t// set up stencil\n\n\t\tlet writeValue, clearValue;\n\n\t\tif ( this.inverse ) {\n\n\t\t\twriteValue = 0;\n\t\t\tclearValue = 1;\n\n\t\t} else {\n\n\t\t\twriteValue = 1;\n\t\t\tclearValue = 0;\n\n\t\t}\n\n\t\tstate.buffers.stencil.setTest( true );\n\t\tstate.buffers.stencil.setOp( context.REPLACE, context.REPLACE, context.REPLACE );\n\t\tstate.buffers.stencil.setFunc( context.ALWAYS, writeValue, 0xffffffff );\n\t\tstate.buffers.stencil.setClear( clearValue );\n\t\tstate.buffers.stencil.setLocked( true );\n\n\t\t// draw into the stencil buffer\n\n\t\trenderer.setRenderTarget( readBuffer );\n\t\tif ( this.clear ) renderer.clear();\n\t\trenderer.render( this.scene, this.camera );\n\n\t\trenderer.setRenderTarget( writeBuffer );\n\t\tif ( this.clear ) renderer.clear();\n\t\trenderer.render( this.scene, this.camera );\n\n\t\t// unlock color and depth buffer and make them writable for subsequent rendering/clearing\n\n\t\tstate.buffers.color.setLocked( false );\n\t\tstate.buffers.depth.setLocked( false );\n\n\t\tstate.buffers.color.setMask( true );\n\t\tstate.buffers.depth.setMask( true );\n\n\t\t// only render where stencil is set to 1\n\n\t\tstate.buffers.stencil.setLocked( false );\n\t\tstate.buffers.stencil.setFunc( context.EQUAL, 1, 0xffffffff ); // draw if == 1\n\t\tstate.buffers.stencil.setOp( context.KEEP, context.KEEP, context.KEEP );\n\t\tstate.buffers.stencil.setLocked( true );\n\n\t}\n\n}\n\nclass ClearMaskPass extends Pass {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.needsSwap = false;\n\n\t}\n\n\trender( renderer /*, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\trenderer.state.buffers.stencil.setLocked( false );\n\t\trenderer.state.buffers.stencil.setTest( false );\n\n\t}\n\n}\n\nexport { MaskPass, ClearMaskPass };\n","import {\n\tClock,\n\tHalfFloatType,\n\tNoBlending,\n\tVector2,\n\tWebGLRenderTarget\n} from 'three';\nimport { CopyShader } from '../shaders/CopyShader.js';\nimport { ShaderPass } from './ShaderPass.js';\nimport { MaskPass } from './MaskPass.js';\nimport { ClearMaskPass } from './MaskPass.js';\n\nclass EffectComposer {\n\n\tconstructor( renderer, renderTarget ) {\n\n\t\tthis.renderer = renderer;\n\n\t\tthis._pixelRatio = renderer.getPixelRatio();\n\n\t\tif ( renderTarget === undefined ) {\n\n\t\t\tconst size = renderer.getSize( new Vector2() );\n\t\t\tthis._width = size.width;\n\t\t\tthis._height = size.height;\n\n\t\t\trenderTarget = new WebGLRenderTarget( this._width * this._pixelRatio, this._height * this._pixelRatio, { type: HalfFloatType } );\n\t\t\trenderTarget.texture.name = 'EffectComposer.rt1';\n\n\t\t} else {\n\n\t\t\tthis._width = renderTarget.width;\n\t\t\tthis._height = renderTarget.height;\n\n\t\t}\n\n\t\tthis.renderTarget1 = renderTarget;\n\t\tthis.renderTarget2 = renderTarget.clone();\n\t\tthis.renderTarget2.texture.name = 'EffectComposer.rt2';\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\tthis.renderToScreen = true;\n\n\t\tthis.passes = [];\n\n\t\tthis.copyPass = new ShaderPass( CopyShader );\n\t\tthis.copyPass.material.blending = NoBlending;\n\n\t\tthis.clock = new Clock();\n\n\t}\n\n\tswapBuffers() {\n\n\t\tconst tmp = this.readBuffer;\n\t\tthis.readBuffer = this.writeBuffer;\n\t\tthis.writeBuffer = tmp;\n\n\t}\n\n\taddPass( pass ) {\n\n\t\tthis.passes.push( pass );\n\t\tpass.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t}\n\n\tinsertPass( pass, index ) {\n\n\t\tthis.passes.splice( index, 0, pass );\n\t\tpass.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t}\n\n\tremovePass( pass ) {\n\n\t\tconst index = this.passes.indexOf( pass );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\tthis.passes.splice( index, 1 );\n\n\t\t}\n\n\t}\n\n\tisLastEnabledPass( passIndex ) {\n\n\t\tfor ( let i = passIndex + 1; i < this.passes.length; i ++ ) {\n\n\t\t\tif ( this.passes[ i ].enabled ) {\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\trender( deltaTime ) {\n\n\t\t// deltaTime value is in seconds\n\n\t\tif ( deltaTime === undefined ) {\n\n\t\t\tdeltaTime = this.clock.getDelta();\n\n\t\t}\n\n\t\tconst currentRenderTarget = this.renderer.getRenderTarget();\n\n\t\tlet maskActive = false;\n\n\t\tfor ( let i = 0, il = this.passes.length; i < il; i ++ ) {\n\n\t\t\tconst pass = this.passes[ i ];\n\n\t\t\tif ( pass.enabled === false ) continue;\n\n\t\t\tpass.renderToScreen = ( this.renderToScreen && this.isLastEnabledPass( i ) );\n\t\t\tpass.render( this.renderer, this.writeBuffer, this.readBuffer, deltaTime, maskActive );\n\n\t\t\tif ( pass.needsSwap ) {\n\n\t\t\t\tif ( maskActive ) {\n\n\t\t\t\t\tconst context = this.renderer.getContext();\n\t\t\t\t\tconst stencil = this.renderer.state.buffers.stencil;\n\n\t\t\t\t\t//context.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\t\t\t\t\tstencil.setFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n\t\t\t\t\tthis.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, deltaTime );\n\n\t\t\t\t\t//context.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\t\t\t\t\tstencil.setFunc( context.EQUAL, 1, 0xffffffff );\n\n\t\t\t\t}\n\n\t\t\t\tthis.swapBuffers();\n\n\t\t\t}\n\n\t\t\tif ( MaskPass !== undefined ) {\n\n\t\t\t\tif ( pass instanceof MaskPass ) {\n\n\t\t\t\t\tmaskActive = true;\n\n\t\t\t\t} else if ( pass instanceof ClearMaskPass ) {\n\n\t\t\t\t\tmaskActive = false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.renderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n\treset( renderTarget ) {\n\n\t\tif ( renderTarget === undefined ) {\n\n\t\t\tconst size = this.renderer.getSize( new Vector2() );\n\t\t\tthis._pixelRatio = this.renderer.getPixelRatio();\n\t\t\tthis._width = size.width;\n\t\t\tthis._height = size.height;\n\n\t\t\trenderTarget = this.renderTarget1.clone();\n\t\t\trenderTarget.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t\t}\n\n\t\tthis.renderTarget1.dispose();\n\t\tthis.renderTarget2.dispose();\n\t\tthis.renderTarget1 = renderTarget;\n\t\tthis.renderTarget2 = renderTarget.clone();\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t}\n\n\tsetSize( width, height ) {\n\n\t\tthis._width = width;\n\t\tthis._height = height;\n\n\t\tconst effectiveWidth = this._width * this._pixelRatio;\n\t\tconst effectiveHeight = this._height * this._pixelRatio;\n\n\t\tthis.renderTarget1.setSize( effectiveWidth, effectiveHeight );\n\t\tthis.renderTarget2.setSize( effectiveWidth, effectiveHeight );\n\n\t\tfor ( let i = 0; i < this.passes.length; i ++ ) {\n\n\t\t\tthis.passes[ i ].setSize( effectiveWidth, effectiveHeight );\n\n\t\t}\n\n\t}\n\n\tsetPixelRatio( pixelRatio ) {\n\n\t\tthis._pixelRatio = pixelRatio;\n\n\t\tthis.setSize( this._width, this._height );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.renderTarget1.dispose();\n\t\tthis.renderTarget2.dispose();\n\n\t\tthis.copyPass.dispose();\n\n\t}\n\n}\n\nexport { EffectComposer };\n","import {\n\tColor\n} from 'three';\nimport { Pass } from './Pass.js';\n\nclass RenderPass extends Pass {\n\n\tconstructor( scene, camera, overrideMaterial = null, clearColor = null, clearAlpha = null ) {\n\n\t\tsuper();\n\n\t\tthis.scene = scene;\n\t\tthis.camera = camera;\n\n\t\tthis.overrideMaterial = overrideMaterial;\n\n\t\tthis.clearColor = clearColor;\n\t\tthis.clearAlpha = clearAlpha;\n\n\t\tthis.clear = true;\n\t\tthis.clearDepth = false;\n\t\tthis.needsSwap = false;\n\t\tthis._oldClearColor = new Color();\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tconst oldAutoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tlet oldClearAlpha, oldOverrideMaterial;\n\n\t\tif ( this.overrideMaterial !== null ) {\n\n\t\t\toldOverrideMaterial = this.scene.overrideMaterial;\n\n\t\t\tthis.scene.overrideMaterial = this.overrideMaterial;\n\n\t\t}\n\n\t\tif ( this.clearColor !== null ) {\n\n\t\t\trenderer.getClearColor( this._oldClearColor );\n\t\t\trenderer.setClearColor( this.clearColor );\n\n\t\t}\n\n\t\tif ( this.clearAlpha !== null ) {\n\n\t\t\toldClearAlpha = renderer.getClearAlpha();\n\t\t\trenderer.setClearAlpha( this.clearAlpha );\n\n\t\t}\n\n\t\tif ( this.clearDepth == true ) {\n\n\t\t\trenderer.clearDepth();\n\n\t\t}\n\n\t\trenderer.setRenderTarget( this.renderToScreen ? null : readBuffer );\n\n\t\tif ( this.clear === true ) {\n\n\t\t\t// TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t\trenderer.render( this.scene, this.camera );\n\n\t\t// restore\n\n\t\tif ( this.clearColor !== null ) {\n\n\t\t\trenderer.setClearColor( this._oldClearColor );\n\n\t\t}\n\n\t\tif ( this.clearAlpha !== null ) {\n\n\t\t\trenderer.setClearAlpha( oldClearAlpha );\n\n\t\t}\n\n\t\tif ( this.overrideMaterial !== null ) {\n\n\t\t\tthis.scene.overrideMaterial = oldOverrideMaterial;\n\n\t\t}\n\n\t\trenderer.autoClear = oldAutoClear;\n\n\t}\n\n}\n\nexport { RenderPass };\n","import {\n\tAdditiveBlending,\n\tColor,\n\tDoubleSide,\n\tHalfFloatType,\n\tMatrix4,\n\tMeshDepthMaterial,\n\tNoBlending,\n\tRGBADepthPacking,\n\tShaderMaterial,\n\tUniformsUtils,\n\tVector2,\n\tVector3,\n\tWebGLRenderTarget\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\nimport { CopyShader } from '../shaders/CopyShader.js';\n\nclass OutlinePass extends Pass {\n\n\tconstructor( resolution, scene, camera, selectedObjects ) {\n\n\t\tsuper();\n\n\t\tthis.renderScene = scene;\n\t\tthis.renderCamera = camera;\n\t\tthis.selectedObjects = selectedObjects !== undefined ? selectedObjects : [];\n\t\tthis.visibleEdgeColor = new Color( 1, 1, 1 );\n\t\tthis.hiddenEdgeColor = new Color( 0.1, 0.04, 0.02 );\n\t\tthis.edgeGlow = 0.0;\n\t\tthis.usePatternTexture = false;\n\t\tthis.edgeThickness = 1.0;\n\t\tthis.edgeStrength = 3.0;\n\t\tthis.downSampleRatio = 2;\n\t\tthis.pulsePeriod = 0;\n\n\t\tthis._visibilityCache = new Map();\n\n\n\t\tthis.resolution = ( resolution !== undefined ) ? new Vector2( resolution.x, resolution.y ) : new Vector2( 256, 256 );\n\n\t\tconst resx = Math.round( this.resolution.x / this.downSampleRatio );\n\t\tconst resy = Math.round( this.resolution.y / this.downSampleRatio );\n\n\t\tthis.renderTargetMaskBuffer = new WebGLRenderTarget( this.resolution.x, this.resolution.y );\n\t\tthis.renderTargetMaskBuffer.texture.name = 'OutlinePass.mask';\n\t\tthis.renderTargetMaskBuffer.texture.generateMipmaps = false;\n\n\t\tthis.depthMaterial = new MeshDepthMaterial();\n\t\tthis.depthMaterial.side = DoubleSide;\n\t\tthis.depthMaterial.depthPacking = RGBADepthPacking;\n\t\tthis.depthMaterial.blending = NoBlending;\n\n\t\tthis.prepareMaskMaterial = this.getPrepareMaskMaterial();\n\t\tthis.prepareMaskMaterial.side = DoubleSide;\n\t\tthis.prepareMaskMaterial.fragmentShader = replaceDepthToViewZ( this.prepareMaskMaterial.fragmentShader, this.renderCamera );\n\n\t\tthis.renderTargetDepthBuffer = new WebGLRenderTarget( this.resolution.x, this.resolution.y, { type: HalfFloatType } );\n\t\tthis.renderTargetDepthBuffer.texture.name = 'OutlinePass.depth';\n\t\tthis.renderTargetDepthBuffer.texture.generateMipmaps = false;\n\n\t\tthis.renderTargetMaskDownSampleBuffer = new WebGLRenderTarget( resx, resy, { type: HalfFloatType } );\n\t\tthis.renderTargetMaskDownSampleBuffer.texture.name = 'OutlinePass.depthDownSample';\n\t\tthis.renderTargetMaskDownSampleBuffer.texture.generateMipmaps = false;\n\n\t\tthis.renderTargetBlurBuffer1 = new WebGLRenderTarget( resx, resy, { type: HalfFloatType } );\n\t\tthis.renderTargetBlurBuffer1.texture.name = 'OutlinePass.blur1';\n\t\tthis.renderTargetBlurBuffer1.texture.generateMipmaps = false;\n\t\tthis.renderTargetBlurBuffer2 = new WebGLRenderTarget( Math.round( resx / 2 ), Math.round( resy / 2 ), { type: HalfFloatType } );\n\t\tthis.renderTargetBlurBuffer2.texture.name = 'OutlinePass.blur2';\n\t\tthis.renderTargetBlurBuffer2.texture.generateMipmaps = false;\n\n\t\tthis.edgeDetectionMaterial = this.getEdgeDetectionMaterial();\n\t\tthis.renderTargetEdgeBuffer1 = new WebGLRenderTarget( resx, resy, { type: HalfFloatType } );\n\t\tthis.renderTargetEdgeBuffer1.texture.name = 'OutlinePass.edge1';\n\t\tthis.renderTargetEdgeBuffer1.texture.generateMipmaps = false;\n\t\tthis.renderTargetEdgeBuffer2 = new WebGLRenderTarget( Math.round( resx / 2 ), Math.round( resy / 2 ), { type: HalfFloatType } );\n\t\tthis.renderTargetEdgeBuffer2.texture.name = 'OutlinePass.edge2';\n\t\tthis.renderTargetEdgeBuffer2.texture.generateMipmaps = false;\n\n\t\tconst MAX_EDGE_THICKNESS = 4;\n\t\tconst MAX_EDGE_GLOW = 4;\n\n\t\tthis.separableBlurMaterial1 = this.getSeperableBlurMaterial( MAX_EDGE_THICKNESS );\n\t\tthis.separableBlurMaterial1.uniforms[ 'texSize' ].value.set( resx, resy );\n\t\tthis.separableBlurMaterial1.uniforms[ 'kernelRadius' ].value = 1;\n\t\tthis.separableBlurMaterial2 = this.getSeperableBlurMaterial( MAX_EDGE_GLOW );\n\t\tthis.separableBlurMaterial2.uniforms[ 'texSize' ].value.set( Math.round( resx / 2 ), Math.round( resy / 2 ) );\n\t\tthis.separableBlurMaterial2.uniforms[ 'kernelRadius' ].value = MAX_EDGE_GLOW;\n\n\t\t// Overlay material\n\t\tthis.overlayMaterial = this.getOverlayMaterial();\n\n\t\t// copy material\n\n\t\tconst copyShader = CopyShader;\n\n\t\tthis.copyUniforms = UniformsUtils.clone( copyShader.uniforms );\n\n\t\tthis.materialCopy = new ShaderMaterial( {\n\t\t\tuniforms: this.copyUniforms,\n\t\t\tvertexShader: copyShader.vertexShader,\n\t\t\tfragmentShader: copyShader.fragmentShader,\n\t\t\tblending: NoBlending,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false\n\t\t} );\n\n\t\tthis.enabled = true;\n\t\tthis.needsSwap = false;\n\n\t\tthis._oldClearColor = new Color();\n\t\tthis.oldClearAlpha = 1;\n\n\t\tthis.fsQuad = new FullScreenQuad( null );\n\n\t\tthis.tempPulseColor1 = new Color();\n\t\tthis.tempPulseColor2 = new Color();\n\t\tthis.textureMatrix = new Matrix4();\n\n\t\tfunction replaceDepthToViewZ( string, camera ) {\n\n\t\t\tconst type = camera.isPerspectiveCamera ? 'perspective' : 'orthographic';\n\n\t\t\treturn string.replace( /DEPTH_TO_VIEW_Z/g, type + 'DepthToViewZ' );\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tthis.renderTargetMaskBuffer.dispose();\n\t\tthis.renderTargetDepthBuffer.dispose();\n\t\tthis.renderTargetMaskDownSampleBuffer.dispose();\n\t\tthis.renderTargetBlurBuffer1.dispose();\n\t\tthis.renderTargetBlurBuffer2.dispose();\n\t\tthis.renderTargetEdgeBuffer1.dispose();\n\t\tthis.renderTargetEdgeBuffer2.dispose();\n\n\t\tthis.depthMaterial.dispose();\n\t\tthis.prepareMaskMaterial.dispose();\n\t\tthis.edgeDetectionMaterial.dispose();\n\t\tthis.separableBlurMaterial1.dispose();\n\t\tthis.separableBlurMaterial2.dispose();\n\t\tthis.overlayMaterial.dispose();\n\t\tthis.materialCopy.dispose();\n\n\t\tthis.fsQuad.dispose();\n\n\t}\n\n\tsetSize( width, height ) {\n\n\t\tthis.renderTargetMaskBuffer.setSize( width, height );\n\t\tthis.renderTargetDepthBuffer.setSize( width, height );\n\n\t\tlet resx = Math.round( width / this.downSampleRatio );\n\t\tlet resy = Math.round( height / this.downSampleRatio );\n\t\tthis.renderTargetMaskDownSampleBuffer.setSize( resx, resy );\n\t\tthis.renderTargetBlurBuffer1.setSize( resx, resy );\n\t\tthis.renderTargetEdgeBuffer1.setSize( resx, resy );\n\t\tthis.separableBlurMaterial1.uniforms[ 'texSize' ].value.set( resx, resy );\n\n\t\tresx = Math.round( resx / 2 );\n\t\tresy = Math.round( resy / 2 );\n\n\t\tthis.renderTargetBlurBuffer2.setSize( resx, resy );\n\t\tthis.renderTargetEdgeBuffer2.setSize( resx, resy );\n\n\t\tthis.separableBlurMaterial2.uniforms[ 'texSize' ].value.set( resx, resy );\n\n\t}\n\n\tchangeVisibilityOfSelectedObjects( bVisible ) {\n\n\t\tconst cache = this._visibilityCache;\n\n\t\tfunction gatherSelectedMeshesCallBack( object ) {\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tif ( bVisible === true ) {\n\n\t\t\t\t\tobject.visible = cache.get( object );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcache.set( object, object.visible );\n\t\t\t\t\tobject.visible = bVisible;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < this.selectedObjects.length; i ++ ) {\n\n\t\t\tconst selectedObject = this.selectedObjects[ i ];\n\t\t\tselectedObject.traverse( gatherSelectedMeshesCallBack );\n\n\t\t}\n\n\t}\n\n\tchangeVisibilityOfNonSelectedObjects( bVisible ) {\n\n\t\tconst cache = this._visibilityCache;\n\t\tconst selectedMeshes = [];\n\n\t\tfunction gatherSelectedMeshesCallBack( object ) {\n\n\t\t\tif ( object.isMesh ) selectedMeshes.push( object );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < this.selectedObjects.length; i ++ ) {\n\n\t\t\tconst selectedObject = this.selectedObjects[ i ];\n\t\t\tselectedObject.traverse( gatherSelectedMeshesCallBack );\n\n\t\t}\n\n\t\tfunction VisibilityChangeCallBack( object ) {\n\n\t\t\tif ( object.isMesh || object.isSprite ) {\n\n\t\t\t\t// only meshes and sprites are supported by OutlinePass\n\n\t\t\t\tlet bFound = false;\n\n\t\t\t\tfor ( let i = 0; i < selectedMeshes.length; i ++ ) {\n\n\t\t\t\t\tconst selectedObjectId = selectedMeshes[ i ].id;\n\n\t\t\t\t\tif ( selectedObjectId === object.id ) {\n\n\t\t\t\t\t\tbFound = true;\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\tif ( bFound === false ) {\n\n\t\t\t\t\tconst visibility = object.visible;\n\n\t\t\t\t\tif ( bVisible === false || cache.get( object ) === true ) {\n\n\t\t\t\t\t\tobject.visible = bVisible;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcache.set( object, visibility );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isPoints || object.isLine ) {\n\n\t\t\t\t// the visibilty of points and lines is always set to false in order to\n\t\t\t\t// not affect the outline computation\n\n\t\t\t\tif ( bVisible === true ) {\n\n\t\t\t\t\tobject.visible = cache.get( object ); // restore\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcache.set( object, object.visible );\n\t\t\t\t\tobject.visible = bVisible;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.renderScene.traverse( VisibilityChangeCallBack );\n\n\t}\n\n\tupdateTextureMatrix() {\n\n\t\tthis.textureMatrix.set( 0.5, 0.0, 0.0, 0.5,\n\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t0.0, 0.0, 0.0, 1.0 );\n\t\tthis.textureMatrix.multiply( this.renderCamera.projectionMatrix );\n\t\tthis.textureMatrix.multiply( this.renderCamera.matrixWorldInverse );\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer, deltaTime, maskActive ) {\n\n\t\tif ( this.selectedObjects.length > 0 ) {\n\n\t\t\trenderer.getClearColor( this._oldClearColor );\n\t\t\tthis.oldClearAlpha = renderer.getClearAlpha();\n\t\t\tconst oldAutoClear = renderer.autoClear;\n\n\t\t\trenderer.autoClear = false;\n\n\t\t\tif ( maskActive ) renderer.state.buffers.stencil.setTest( false );\n\n\t\t\trenderer.setClearColor( 0xffffff, 1 );\n\n\t\t\t// Make selected objects invisible\n\t\t\tthis.changeVisibilityOfSelectedObjects( false );\n\n\t\t\tconst currentBackground = this.renderScene.background;\n\t\t\tthis.renderScene.background = null;\n\n\t\t\t// 1. Draw Non Selected objects in the depth buffer\n\t\t\tthis.renderScene.overrideMaterial = this.depthMaterial;\n\t\t\trenderer.setRenderTarget( this.renderTargetDepthBuffer );\n\t\t\trenderer.clear();\n\t\t\trenderer.render( this.renderScene, this.renderCamera );\n\n\t\t\t// Make selected objects visible\n\t\t\tthis.changeVisibilityOfSelectedObjects( true );\n\t\t\tthis._visibilityCache.clear();\n\n\t\t\t// Update Texture Matrix for Depth compare\n\t\t\tthis.updateTextureMatrix();\n\n\t\t\t// Make non selected objects invisible, and draw only the selected objects, by comparing the depth buffer of non selected objects\n\t\t\tthis.changeVisibilityOfNonSelectedObjects( false );\n\t\t\tthis.renderScene.overrideMaterial = this.prepareMaskMaterial;\n\t\t\tthis.prepareMaskMaterial.uniforms[ 'cameraNearFar' ].value.set( this.renderCamera.near, this.renderCamera.far );\n\t\t\tthis.prepareMaskMaterial.uniforms[ 'depthTexture' ].value = this.renderTargetDepthBuffer.texture;\n\t\t\tthis.prepareMaskMaterial.uniforms[ 'textureMatrix' ].value = this.textureMatrix;\n\t\t\trenderer.setRenderTarget( this.renderTargetMaskBuffer );\n\t\t\trenderer.clear();\n\t\t\trenderer.render( this.renderScene, this.renderCamera );\n\t\t\tthis.renderScene.overrideMaterial = null;\n\t\t\tthis.changeVisibilityOfNonSelectedObjects( true );\n\t\t\tthis._visibilityCache.clear();\n\n\t\t\tthis.renderScene.background = currentBackground;\n\n\t\t\t// 2. Downsample to Half resolution\n\t\t\tthis.fsQuad.material = this.materialCopy;\n\t\t\tthis.copyUniforms[ 'tDiffuse' ].value = this.renderTargetMaskBuffer.texture;\n\t\t\trenderer.setRenderTarget( this.renderTargetMaskDownSampleBuffer );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t\tthis.tempPulseColor1.copy( this.visibleEdgeColor );\n\t\t\tthis.tempPulseColor2.copy( this.hiddenEdgeColor );\n\n\t\t\tif ( this.pulsePeriod > 0 ) {\n\n\t\t\t\tconst scalar = ( 1 + 0.25 ) / 2 + Math.cos( performance.now() * 0.01 / this.pulsePeriod ) * ( 1.0 - 0.25 ) / 2;\n\t\t\t\tthis.tempPulseColor1.multiplyScalar( scalar );\n\t\t\t\tthis.tempPulseColor2.multiplyScalar( scalar );\n\n\t\t\t}\n\n\t\t\t// 3. Apply Edge Detection Pass\n\t\t\tthis.fsQuad.material = this.edgeDetectionMaterial;\n\t\t\tthis.edgeDetectionMaterial.uniforms[ 'maskTexture' ].value = this.renderTargetMaskDownSampleBuffer.texture;\n\t\t\tthis.edgeDetectionMaterial.uniforms[ 'texSize' ].value.set( this.renderTargetMaskDownSampleBuffer.width, this.renderTargetMaskDownSampleBuffer.height );\n\t\t\tthis.edgeDetectionMaterial.uniforms[ 'visibleEdgeColor' ].value = this.tempPulseColor1;\n\t\t\tthis.edgeDetectionMaterial.uniforms[ 'hiddenEdgeColor' ].value = this.tempPulseColor2;\n\t\t\trenderer.setRenderTarget( this.renderTargetEdgeBuffer1 );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t\t// 4. Apply Blur on Half res\n\t\t\tthis.fsQuad.material = this.separableBlurMaterial1;\n\t\t\tthis.separableBlurMaterial1.uniforms[ 'colorTexture' ].value = this.renderTargetEdgeBuffer1.texture;\n\t\t\tthis.separableBlurMaterial1.uniforms[ 'direction' ].value = OutlinePass.BlurDirectionX;\n\t\t\tthis.separableBlurMaterial1.uniforms[ 'kernelRadius' ].value = this.edgeThickness;\n\t\t\trenderer.setRenderTarget( this.renderTargetBlurBuffer1 );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\t\t\tthis.separableBlurMaterial1.uniforms[ 'colorTexture' ].value = this.renderTargetBlurBuffer1.texture;\n\t\t\tthis.separableBlurMaterial1.uniforms[ 'direction' ].value = OutlinePass.BlurDirectionY;\n\t\t\trenderer.setRenderTarget( this.renderTargetEdgeBuffer1 );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t\t// Apply Blur on quarter res\n\t\t\tthis.fsQuad.material = this.separableBlurMaterial2;\n\t\t\tthis.separableBlurMaterial2.uniforms[ 'colorTexture' ].value = this.renderTargetEdgeBuffer1.texture;\n\t\t\tthis.separableBlurMaterial2.uniforms[ 'direction' ].value = OutlinePass.BlurDirectionX;\n\t\t\trenderer.setRenderTarget( this.renderTargetBlurBuffer2 );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\t\t\tthis.separableBlurMaterial2.uniforms[ 'colorTexture' ].value = this.renderTargetBlurBuffer2.texture;\n\t\t\tthis.separableBlurMaterial2.uniforms[ 'direction' ].value = OutlinePass.BlurDirectionY;\n\t\t\trenderer.setRenderTarget( this.renderTargetEdgeBuffer2 );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t\t// Blend it additively over the input texture\n\t\t\tthis.fsQuad.material = this.overlayMaterial;\n\t\t\tthis.overlayMaterial.uniforms[ 'maskTexture' ].value = this.renderTargetMaskBuffer.texture;\n\t\t\tthis.overlayMaterial.uniforms[ 'edgeTexture1' ].value = this.renderTargetEdgeBuffer1.texture;\n\t\t\tthis.overlayMaterial.uniforms[ 'edgeTexture2' ].value = this.renderTargetEdgeBuffer2.texture;\n\t\t\tthis.overlayMaterial.uniforms[ 'patternTexture' ].value = this.patternTexture;\n\t\t\tthis.overlayMaterial.uniforms[ 'edgeStrength' ].value = this.edgeStrength;\n\t\t\tthis.overlayMaterial.uniforms[ 'edgeGlow' ].value = this.edgeGlow;\n\t\t\tthis.overlayMaterial.uniforms[ 'usePatternTexture' ].value = this.usePatternTexture;\n\n\n\t\t\tif ( maskActive ) renderer.state.buffers.stencil.setTest( true );\n\n\t\t\trenderer.setRenderTarget( readBuffer );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t\trenderer.setClearColor( this._oldClearColor, this.oldClearAlpha );\n\t\t\trenderer.autoClear = oldAutoClear;\n\n\t\t}\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\tthis.fsQuad.material = this.materialCopy;\n\t\t\tthis.copyUniforms[ 'tDiffuse' ].value = readBuffer.texture;\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t}\n\n\t}\n\n\tgetPrepareMaskMaterial() {\n\n\t\treturn new ShaderMaterial( {\n\n\t\t\tuniforms: {\n\t\t\t\t'depthTexture': { value: null },\n\t\t\t\t'cameraNearFar': { value: new Vector2( 0.5, 0.5 ) },\n\t\t\t\t'textureMatrix': { value: null }\n\t\t\t},\n\n\t\t\tvertexShader:\n\t\t\t\t`#include <morphtarget_pars_vertex>\n\t\t\t\t#include <skinning_pars_vertex>\n\n\t\t\t\tvarying vec4 projTexCoord;\n\t\t\t\tvarying vec4 vPosition;\n\t\t\t\tuniform mat4 textureMatrix;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\t#include <skinbase_vertex>\n\t\t\t\t\t#include <begin_vertex>\n\t\t\t\t\t#include <morphtarget_vertex>\n\t\t\t\t\t#include <skinning_vertex>\n\t\t\t\t\t#include <project_vertex>\n\n\t\t\t\t\tvPosition = mvPosition;\n\n\t\t\t\t\tvec4 worldPosition = vec4( transformed, 1.0 );\n\n\t\t\t\t\t#ifdef USE_INSTANCING\n\n\t\t\t\t\t\tworldPosition = instanceMatrix * worldPosition;\n\n\t\t\t\t\t#endif\n\t\t\t\t\t\n\t\t\t\t\tworldPosition = modelMatrix * worldPosition;\n\n\t\t\t\t\tprojTexCoord = textureMatrix * worldPosition;\n\n\t\t\t\t}`,\n\n\t\t\tfragmentShader:\n\t\t\t\t`#include <packing>\n\t\t\t\tvarying vec4 vPosition;\n\t\t\t\tvarying vec4 projTexCoord;\n\t\t\t\tuniform sampler2D depthTexture;\n\t\t\t\tuniform vec2 cameraNearFar;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tfloat depth = unpackRGBAToDepth(texture2DProj( depthTexture, projTexCoord ));\n\t\t\t\t\tfloat viewZ = - DEPTH_TO_VIEW_Z( depth, cameraNearFar.x, cameraNearFar.y );\n\t\t\t\t\tfloat depthTest = (-vPosition.z > viewZ) ? 1.0 : 0.0;\n\t\t\t\t\tgl_FragColor = vec4(0.0, depthTest, 1.0, 1.0);\n\n\t\t\t\t}`\n\n\t\t} );\n\n\t}\n\n\tgetEdgeDetectionMaterial() {\n\n\t\treturn new ShaderMaterial( {\n\n\t\t\tuniforms: {\n\t\t\t\t'maskTexture': { value: null },\n\t\t\t\t'texSize': { value: new Vector2( 0.5, 0.5 ) },\n\t\t\t\t'visibleEdgeColor': { value: new Vector3( 1.0, 1.0, 1.0 ) },\n\t\t\t\t'hiddenEdgeColor': { value: new Vector3( 1.0, 1.0, 1.0 ) },\n\t\t\t},\n\n\t\t\tvertexShader:\n\t\t\t\t`varying vec2 vUv;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\n\t\t\tfragmentShader:\n\t\t\t\t`varying vec2 vUv;\n\n\t\t\t\tuniform sampler2D maskTexture;\n\t\t\t\tuniform vec2 texSize;\n\t\t\t\tuniform vec3 visibleEdgeColor;\n\t\t\t\tuniform vec3 hiddenEdgeColor;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec2 invSize = 1.0 / texSize;\n\t\t\t\t\tvec4 uvOffset = vec4(1.0, 0.0, 0.0, 1.0) * vec4(invSize, invSize);\n\t\t\t\t\tvec4 c1 = texture2D( maskTexture, vUv + uvOffset.xy);\n\t\t\t\t\tvec4 c2 = texture2D( maskTexture, vUv - uvOffset.xy);\n\t\t\t\t\tvec4 c3 = texture2D( maskTexture, vUv + uvOffset.yw);\n\t\t\t\t\tvec4 c4 = texture2D( maskTexture, vUv - uvOffset.yw);\n\t\t\t\t\tfloat diff1 = (c1.r - c2.r)*0.5;\n\t\t\t\t\tfloat diff2 = (c3.r - c4.r)*0.5;\n\t\t\t\t\tfloat d = length( vec2(diff1, diff2) );\n\t\t\t\t\tfloat a1 = min(c1.g, c2.g);\n\t\t\t\t\tfloat a2 = min(c3.g, c4.g);\n\t\t\t\t\tfloat visibilityFactor = min(a1, a2);\n\t\t\t\t\tvec3 edgeColor = 1.0 - visibilityFactor > 0.001 ? visibleEdgeColor : hiddenEdgeColor;\n\t\t\t\t\tgl_FragColor = vec4(edgeColor, 1.0) * vec4(d);\n\t\t\t\t}`\n\t\t} );\n\n\t}\n\n\tgetSeperableBlurMaterial( maxRadius ) {\n\n\t\treturn new ShaderMaterial( {\n\n\t\t\tdefines: {\n\t\t\t\t'MAX_RADIUS': maxRadius,\n\t\t\t},\n\n\t\t\tuniforms: {\n\t\t\t\t'colorTexture': { value: null },\n\t\t\t\t'texSize': { value: new Vector2( 0.5, 0.5 ) },\n\t\t\t\t'direction': { value: new Vector2( 0.5, 0.5 ) },\n\t\t\t\t'kernelRadius': { value: 1.0 }\n\t\t\t},\n\n\t\t\tvertexShader:\n\t\t\t\t`varying vec2 vUv;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\n\t\t\tfragmentShader:\n\t\t\t\t`#include <common>\n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tuniform sampler2D colorTexture;\n\t\t\t\tuniform vec2 texSize;\n\t\t\t\tuniform vec2 direction;\n\t\t\t\tuniform float kernelRadius;\n\n\t\t\t\tfloat gaussianPdf(in float x, in float sigma) {\n\t\t\t\t\treturn 0.39894 * exp( -0.5 * x * x/( sigma * sigma))/sigma;\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec2 invSize = 1.0 / texSize;\n\t\t\t\t\tfloat sigma = kernelRadius/2.0;\n\t\t\t\t\tfloat weightSum = gaussianPdf(0.0, sigma);\n\t\t\t\t\tvec4 diffuseSum = texture2D( colorTexture, vUv) * weightSum;\n\t\t\t\t\tvec2 delta = direction * invSize * kernelRadius/float(MAX_RADIUS);\n\t\t\t\t\tvec2 uvOffset = delta;\n\t\t\t\t\tfor( int i = 1; i <= MAX_RADIUS; i ++ ) {\n\t\t\t\t\t\tfloat x = kernelRadius * float(i) / float(MAX_RADIUS);\n\t\t\t\t\t\tfloat w = gaussianPdf(x, sigma);\n\t\t\t\t\t\tvec4 sample1 = texture2D( colorTexture, vUv + uvOffset);\n\t\t\t\t\t\tvec4 sample2 = texture2D( colorTexture, vUv - uvOffset);\n\t\t\t\t\t\tdiffuseSum += ((sample1 + sample2) * w);\n\t\t\t\t\t\tweightSum += (2.0 * w);\n\t\t\t\t\t\tuvOffset += delta;\n\t\t\t\t\t}\n\t\t\t\t\tgl_FragColor = diffuseSum/weightSum;\n\t\t\t\t}`\n\t\t} );\n\n\t}\n\n\tgetOverlayMaterial() {\n\n\t\treturn new ShaderMaterial( {\n\n\t\t\tuniforms: {\n\t\t\t\t'maskTexture': { value: null },\n\t\t\t\t'edgeTexture1': { value: null },\n\t\t\t\t'edgeTexture2': { value: null },\n\t\t\t\t'patternTexture': { value: null },\n\t\t\t\t'edgeStrength': { value: 1.0 },\n\t\t\t\t'edgeGlow': { value: 1.0 },\n\t\t\t\t'usePatternTexture': { value: 0.0 }\n\t\t\t},\n\n\t\t\tvertexShader:\n\t\t\t\t`varying vec2 vUv;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\n\t\t\tfragmentShader:\n\t\t\t\t`varying vec2 vUv;\n\n\t\t\t\tuniform sampler2D maskTexture;\n\t\t\t\tuniform sampler2D edgeTexture1;\n\t\t\t\tuniform sampler2D edgeTexture2;\n\t\t\t\tuniform sampler2D patternTexture;\n\t\t\t\tuniform float edgeStrength;\n\t\t\t\tuniform float edgeGlow;\n\t\t\t\tuniform bool usePatternTexture;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec4 edgeValue1 = texture2D(edgeTexture1, vUv);\n\t\t\t\t\tvec4 edgeValue2 = texture2D(edgeTexture2, vUv);\n\t\t\t\t\tvec4 maskColor = texture2D(maskTexture, vUv);\n\t\t\t\t\tvec4 patternColor = texture2D(patternTexture, 6.0 * vUv);\n\t\t\t\t\tfloat visibilityFactor = 1.0 - maskColor.g > 0.0 ? 1.0 : 0.5;\n\t\t\t\t\tvec4 edgeValue = edgeValue1 + edgeValue2 * edgeGlow;\n\t\t\t\t\tvec4 finalColor = edgeStrength * maskColor.r * edgeValue;\n\t\t\t\t\tif(usePatternTexture)\n\t\t\t\t\t\tfinalColor += + visibilityFactor * (1.0 - maskColor.r) * (1.0 - patternColor.r);\n\t\t\t\t\tgl_FragColor = finalColor;\n\t\t\t\t}`,\n\t\t\tblending: AdditiveBlending,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\ttransparent: true\n\t\t} );\n\n\t}\n\n}\n\nOutlinePass.BlurDirectionX = new Vector2( 1.0, 0.0 );\nOutlinePass.BlurDirectionY = new Vector2( 0.0, 1.0 );\n\nexport { OutlinePass };\n","import {\n\tVector2\n} from 'three';\n\n/**\n * WebGL port of Subpixel Morphological Antialiasing (SMAA) v2.8\n * Preset: SMAA 1x Medium (with color edge detection)\n * https://github.com/iryoku/smaa/releases/tag/v2.8\n */\n\nconst SMAAEdgesShader = {\n\n\tname: 'SMAAEdgesShader',\n\n\tdefines: {\n\n\t\t'SMAA_THRESHOLD': '0.1'\n\n\t},\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'resolution': { value: new Vector2( 1 / 1024, 1 / 512 ) }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tuniform vec2 resolution;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vOffset[ 3 ];\n\n\t\tvoid SMAAEdgeDetectionVS( vec2 texcoord ) {\n\t\t\tvOffset[ 0 ] = texcoord.xyxy + resolution.xyxy * vec4( -1.0, 0.0, 0.0, 1.0 ); // WebGL port note: Changed sign in W component\n\t\t\tvOffset[ 1 ] = texcoord.xyxy + resolution.xyxy * vec4( 1.0, 0.0, 0.0, -1.0 ); // WebGL port note: Changed sign in W component\n\t\t\tvOffset[ 2 ] = texcoord.xyxy + resolution.xyxy * vec4( -2.0, 0.0, 0.0, 2.0 ); // WebGL port note: Changed sign in W component\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tSMAAEdgeDetectionVS( vUv );\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vOffset[ 3 ];\n\n\t\tvec4 SMAAColorEdgeDetectionPS( vec2 texcoord, vec4 offset[3], sampler2D colorTex ) {\n\t\t\tvec2 threshold = vec2( SMAA_THRESHOLD, SMAA_THRESHOLD );\n\n\t\t\t// Calculate color deltas:\n\t\t\tvec4 delta;\n\t\t\tvec3 C = texture2D( colorTex, texcoord ).rgb;\n\n\t\t\tvec3 Cleft = texture2D( colorTex, offset[0].xy ).rgb;\n\t\t\tvec3 t = abs( C - Cleft );\n\t\t\tdelta.x = max( max( t.r, t.g ), t.b );\n\n\t\t\tvec3 Ctop = texture2D( colorTex, offset[0].zw ).rgb;\n\t\t\tt = abs( C - Ctop );\n\t\t\tdelta.y = max( max( t.r, t.g ), t.b );\n\n\t\t\t// We do the usual threshold:\n\t\t\tvec2 edges = step( threshold, delta.xy );\n\n\t\t\t// Then discard if there is no edge:\n\t\t\tif ( dot( edges, vec2( 1.0, 1.0 ) ) == 0.0 )\n\t\t\t\tdiscard;\n\n\t\t\t// Calculate right and bottom deltas:\n\t\t\tvec3 Cright = texture2D( colorTex, offset[1].xy ).rgb;\n\t\t\tt = abs( C - Cright );\n\t\t\tdelta.z = max( max( t.r, t.g ), t.b );\n\n\t\t\tvec3 Cbottom = texture2D( colorTex, offset[1].zw ).rgb;\n\t\t\tt = abs( C - Cbottom );\n\t\t\tdelta.w = max( max( t.r, t.g ), t.b );\n\n\t\t\t// Calculate the maximum delta in the direct neighborhood:\n\t\t\tfloat maxDelta = max( max( max( delta.x, delta.y ), delta.z ), delta.w );\n\n\t\t\t// Calculate left-left and top-top deltas:\n\t\t\tvec3 Cleftleft = texture2D( colorTex, offset[2].xy ).rgb;\n\t\t\tt = abs( C - Cleftleft );\n\t\t\tdelta.z = max( max( t.r, t.g ), t.b );\n\n\t\t\tvec3 Ctoptop = texture2D( colorTex, offset[2].zw ).rgb;\n\t\t\tt = abs( C - Ctoptop );\n\t\t\tdelta.w = max( max( t.r, t.g ), t.b );\n\n\t\t\t// Calculate the final maximum delta:\n\t\t\tmaxDelta = max( max( maxDelta, delta.z ), delta.w );\n\n\t\t\t// Local contrast adaptation in action:\n\t\t\tedges.xy *= step( 0.5 * maxDelta, delta.xy );\n\n\t\t\treturn vec4( edges, 0.0, 0.0 );\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = SMAAColorEdgeDetectionPS( vUv, vOffset, tDiffuse );\n\n\t\t}`\n\n};\n\nconst SMAAWeightsShader = {\n\n\tname: 'SMAAWeightsShader',\n\n\tdefines: {\n\n\t\t'SMAA_MAX_SEARCH_STEPS': '8',\n\t\t'SMAA_AREATEX_MAX_DISTANCE': '16',\n\t\t'SMAA_AREATEX_PIXEL_SIZE': '( 1.0 / vec2( 160.0, 560.0 ) )',\n\t\t'SMAA_AREATEX_SUBTEX_SIZE': '( 1.0 / 7.0 )'\n\n\t},\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'tArea': { value: null },\n\t\t'tSearch': { value: null },\n\t\t'resolution': { value: new Vector2( 1 / 1024, 1 / 512 ) }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tuniform vec2 resolution;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vOffset[ 3 ];\n\t\tvarying vec2 vPixcoord;\n\n\t\tvoid SMAABlendingWeightCalculationVS( vec2 texcoord ) {\n\t\t\tvPixcoord = texcoord / resolution;\n\n\t\t\t// We will use these offsets for the searches later on (see @PSEUDO_GATHER4):\n\t\t\tvOffset[ 0 ] = texcoord.xyxy + resolution.xyxy * vec4( -0.25, 0.125, 1.25, 0.125 ); // WebGL port note: Changed sign in Y and W components\n\t\t\tvOffset[ 1 ] = texcoord.xyxy + resolution.xyxy * vec4( -0.125, 0.25, -0.125, -1.25 ); // WebGL port note: Changed sign in Y and W components\n\n\t\t\t// And these for the searches, they indicate the ends of the loops:\n\t\t\tvOffset[ 2 ] = vec4( vOffset[ 0 ].xz, vOffset[ 1 ].yw ) + vec4( -2.0, 2.0, -2.0, 2.0 ) * resolution.xxyy * float( SMAA_MAX_SEARCH_STEPS );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tSMAABlendingWeightCalculationVS( vUv );\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\t#define SMAASampleLevelZeroOffset( tex, coord, offset ) texture2D( tex, coord + float( offset ) * resolution, 0.0 )\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform sampler2D tArea;\n\t\tuniform sampler2D tSearch;\n\t\tuniform vec2 resolution;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vOffset[3];\n\t\tvarying vec2 vPixcoord;\n\n\t\t#if __VERSION__ == 100\n\t\tvec2 round( vec2 x ) {\n\t\t\treturn sign( x ) * floor( abs( x ) + 0.5 );\n\t\t}\n\t\t#endif\n\n\t\tfloat SMAASearchLength( sampler2D searchTex, vec2 e, float bias, float scale ) {\n\t\t\t// Not required if searchTex accesses are set to point:\n\t\t\t// float2 SEARCH_TEX_PIXEL_SIZE = 1.0 / float2(66.0, 33.0);\n\t\t\t// e = float2(bias, 0.0) + 0.5 * SEARCH_TEX_PIXEL_SIZE +\n\t\t\t// e * float2(scale, 1.0) * float2(64.0, 32.0) * SEARCH_TEX_PIXEL_SIZE;\n\t\t\te.r = bias + e.r * scale;\n\t\t\treturn 255.0 * texture2D( searchTex, e, 0.0 ).r;\n\t\t}\n\n\t\tfloat SMAASearchXLeft( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {\n\t\t\t/**\n\t\t\t\t* @PSEUDO_GATHER4\n\t\t\t\t* This texcoord has been offset by (-0.25, -0.125) in the vertex shader to\n\t\t\t\t* sample between edge, thus fetching four edges in a row.\n\t\t\t\t* Sampling with different offsets in each direction allows to disambiguate\n\t\t\t\t* which edges are active from the four fetched ones.\n\t\t\t\t*/\n\t\t\tvec2 e = vec2( 0.0, 1.0 );\n\n\t\t\tfor ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) { // WebGL port note: Changed while to for\n\t\t\t\te = texture2D( edgesTex, texcoord, 0.0 ).rg;\n\t\t\t\ttexcoord -= vec2( 2.0, 0.0 ) * resolution;\n\t\t\t\tif ( ! ( texcoord.x > end && e.g > 0.8281 && e.r == 0.0 ) ) break;\n\t\t\t}\n\n\t\t\t// We correct the previous (-0.25, -0.125) offset we applied:\n\t\t\ttexcoord.x += 0.25 * resolution.x;\n\n\t\t\t// The searches are bias by 1, so adjust the coords accordingly:\n\t\t\ttexcoord.x += resolution.x;\n\n\t\t\t// Disambiguate the length added by the last step:\n\t\t\ttexcoord.x += 2.0 * resolution.x; // Undo last step\n\t\t\ttexcoord.x -= resolution.x * SMAASearchLength(searchTex, e, 0.0, 0.5);\n\n\t\t\treturn texcoord.x;\n\t\t}\n\n\t\tfloat SMAASearchXRight( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {\n\t\t\tvec2 e = vec2( 0.0, 1.0 );\n\n\t\t\tfor ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) { // WebGL port note: Changed while to for\n\t\t\t\te = texture2D( edgesTex, texcoord, 0.0 ).rg;\n\t\t\t\ttexcoord += vec2( 2.0, 0.0 ) * resolution;\n\t\t\t\tif ( ! ( texcoord.x < end && e.g > 0.8281 && e.r == 0.0 ) ) break;\n\t\t\t}\n\n\t\t\ttexcoord.x -= 0.25 * resolution.x;\n\t\t\ttexcoord.x -= resolution.x;\n\t\t\ttexcoord.x -= 2.0 * resolution.x;\n\t\t\ttexcoord.x += resolution.x * SMAASearchLength( searchTex, e, 0.5, 0.5 );\n\n\t\t\treturn texcoord.x;\n\t\t}\n\n\t\tfloat SMAASearchYUp( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {\n\t\t\tvec2 e = vec2( 1.0, 0.0 );\n\n\t\t\tfor ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) { // WebGL port note: Changed while to for\n\t\t\t\te = texture2D( edgesTex, texcoord, 0.0 ).rg;\n\t\t\t\ttexcoord += vec2( 0.0, 2.0 ) * resolution; // WebGL port note: Changed sign\n\t\t\t\tif ( ! ( texcoord.y > end && e.r > 0.8281 && e.g == 0.0 ) ) break;\n\t\t\t}\n\n\t\t\ttexcoord.y -= 0.25 * resolution.y; // WebGL port note: Changed sign\n\t\t\ttexcoord.y -= resolution.y; // WebGL port note: Changed sign\n\t\t\ttexcoord.y -= 2.0 * resolution.y; // WebGL port note: Changed sign\n\t\t\ttexcoord.y += resolution.y * SMAASearchLength( searchTex, e.gr, 0.0, 0.5 ); // WebGL port note: Changed sign\n\n\t\t\treturn texcoord.y;\n\t\t}\n\n\t\tfloat SMAASearchYDown( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {\n\t\t\tvec2 e = vec2( 1.0, 0.0 );\n\n\t\t\tfor ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) { // WebGL port note: Changed while to for\n\t\t\t\te = texture2D( edgesTex, texcoord, 0.0 ).rg;\n\t\t\t\ttexcoord -= vec2( 0.0, 2.0 ) * resolution; // WebGL port note: Changed sign\n\t\t\t\tif ( ! ( texcoord.y < end && e.r > 0.8281 && e.g == 0.0 ) ) break;\n\t\t\t}\n\n\t\t\ttexcoord.y += 0.25 * resolution.y; // WebGL port note: Changed sign\n\t\t\ttexcoord.y += resolution.y; // WebGL port note: Changed sign\n\t\t\ttexcoord.y += 2.0 * resolution.y; // WebGL port note: Changed sign\n\t\t\ttexcoord.y -= resolution.y * SMAASearchLength( searchTex, e.gr, 0.5, 0.5 ); // WebGL port note: Changed sign\n\n\t\t\treturn texcoord.y;\n\t\t}\n\n\t\tvec2 SMAAArea( sampler2D areaTex, vec2 dist, float e1, float e2, float offset ) {\n\t\t\t// Rounding prevents precision errors of bilinear filtering:\n\t\t\tvec2 texcoord = float( SMAA_AREATEX_MAX_DISTANCE ) * round( 4.0 * vec2( e1, e2 ) ) + dist;\n\n\t\t\t// We do a scale and bias for mapping to texel space:\n\t\t\ttexcoord = SMAA_AREATEX_PIXEL_SIZE * texcoord + ( 0.5 * SMAA_AREATEX_PIXEL_SIZE );\n\n\t\t\t// Move to proper place, according to the subpixel offset:\n\t\t\ttexcoord.y += SMAA_AREATEX_SUBTEX_SIZE * offset;\n\n\t\t\treturn texture2D( areaTex, texcoord, 0.0 ).rg;\n\t\t}\n\n\t\tvec4 SMAABlendingWeightCalculationPS( vec2 texcoord, vec2 pixcoord, vec4 offset[ 3 ], sampler2D edgesTex, sampler2D areaTex, sampler2D searchTex, ivec4 subsampleIndices ) {\n\t\t\tvec4 weights = vec4( 0.0, 0.0, 0.0, 0.0 );\n\n\t\t\tvec2 e = texture2D( edgesTex, texcoord ).rg;\n\n\t\t\tif ( e.g > 0.0 ) { // Edge at north\n\t\t\t\tvec2 d;\n\n\t\t\t\t// Find the distance to the left:\n\t\t\t\tvec2 coords;\n\t\t\t\tcoords.x = SMAASearchXLeft( edgesTex, searchTex, offset[ 0 ].xy, offset[ 2 ].x );\n\t\t\t\tcoords.y = offset[ 1 ].y; // offset[1].y = texcoord.y - 0.25 * resolution.y (@CROSSING_OFFSET)\n\t\t\t\td.x = coords.x;\n\n\t\t\t\t// Now fetch the left crossing edges, two at a time using bilinear\n\t\t\t\t// filtering. Sampling at -0.25 (see @CROSSING_OFFSET) enables to\n\t\t\t\t// discern what value each edge has:\n\t\t\t\tfloat e1 = texture2D( edgesTex, coords, 0.0 ).r;\n\n\t\t\t\t// Find the distance to the right:\n\t\t\t\tcoords.x = SMAASearchXRight( edgesTex, searchTex, offset[ 0 ].zw, offset[ 2 ].y );\n\t\t\t\td.y = coords.x;\n\n\t\t\t\t// We want the distances to be in pixel units (doing this here allow to\n\t\t\t\t// better interleave arithmetic and memory accesses):\n\t\t\t\td = d / resolution.x - pixcoord.x;\n\n\t\t\t\t// SMAAArea below needs a sqrt, as the areas texture is compressed\n\t\t\t\t// quadratically:\n\t\t\t\tvec2 sqrt_d = sqrt( abs( d ) );\n\n\t\t\t\t// Fetch the right crossing edges:\n\t\t\t\tcoords.y -= 1.0 * resolution.y; // WebGL port note: Added\n\t\t\t\tfloat e2 = SMAASampleLevelZeroOffset( edgesTex, coords, ivec2( 1, 0 ) ).r;\n\n\t\t\t\t// Ok, we know how this pattern looks like, now it is time for getting\n\t\t\t\t// the actual area:\n\t\t\t\tweights.rg = SMAAArea( areaTex, sqrt_d, e1, e2, float( subsampleIndices.y ) );\n\t\t\t}\n\n\t\t\tif ( e.r > 0.0 ) { // Edge at west\n\t\t\t\tvec2 d;\n\n\t\t\t\t// Find the distance to the top:\n\t\t\t\tvec2 coords;\n\n\t\t\t\tcoords.y = SMAASearchYUp( edgesTex, searchTex, offset[ 1 ].xy, offset[ 2 ].z );\n\t\t\t\tcoords.x = offset[ 0 ].x; // offset[1].x = texcoord.x - 0.25 * resolution.x;\n\t\t\t\td.x = coords.y;\n\n\t\t\t\t// Fetch the top crossing edges:\n\t\t\t\tfloat e1 = texture2D( edgesTex, coords, 0.0 ).g;\n\n\t\t\t\t// Find the distance to the bottom:\n\t\t\t\tcoords.y = SMAASearchYDown( edgesTex, searchTex, offset[ 1 ].zw, offset[ 2 ].w );\n\t\t\t\td.y = coords.y;\n\n\t\t\t\t// We want the distances to be in pixel units:\n\t\t\t\td = d / resolution.y - pixcoord.y;\n\n\t\t\t\t// SMAAArea below needs a sqrt, as the areas texture is compressed\n\t\t\t\t// quadratically:\n\t\t\t\tvec2 sqrt_d = sqrt( abs( d ) );\n\n\t\t\t\t// Fetch the bottom crossing edges:\n\t\t\t\tcoords.y -= 1.0 * resolution.y; // WebGL port note: Added\n\t\t\t\tfloat e2 = SMAASampleLevelZeroOffset( edgesTex, coords, ivec2( 0, 1 ) ).g;\n\n\t\t\t\t// Get the area for this direction:\n\t\t\t\tweights.ba = SMAAArea( areaTex, sqrt_d, e1, e2, float( subsampleIndices.x ) );\n\t\t\t}\n\n\t\t\treturn weights;\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = SMAABlendingWeightCalculationPS( vUv, vPixcoord, vOffset, tDiffuse, tArea, tSearch, ivec4( 0.0 ) );\n\n\t\t}`\n\n};\n\nconst SMAABlendShader = {\n\n\tname: 'SMAABlendShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'tColor': { value: null },\n\t\t'resolution': { value: new Vector2( 1 / 1024, 1 / 512 ) }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tuniform vec2 resolution;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vOffset[ 2 ];\n\n\t\tvoid SMAANeighborhoodBlendingVS( vec2 texcoord ) {\n\t\t\tvOffset[ 0 ] = texcoord.xyxy + resolution.xyxy * vec4( -1.0, 0.0, 0.0, 1.0 ); // WebGL port note: Changed sign in W component\n\t\t\tvOffset[ 1 ] = texcoord.xyxy + resolution.xyxy * vec4( 1.0, 0.0, 0.0, -1.0 ); // WebGL port note: Changed sign in W component\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tSMAANeighborhoodBlendingVS( vUv );\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform sampler2D tColor;\n\t\tuniform vec2 resolution;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vOffset[ 2 ];\n\n\t\tvec4 SMAANeighborhoodBlendingPS( vec2 texcoord, vec4 offset[ 2 ], sampler2D colorTex, sampler2D blendTex ) {\n\t\t\t// Fetch the blending weights for current pixel:\n\t\t\tvec4 a;\n\t\t\ta.xz = texture2D( blendTex, texcoord ).xz;\n\t\t\ta.y = texture2D( blendTex, offset[ 1 ].zw ).g;\n\t\t\ta.w = texture2D( blendTex, offset[ 1 ].xy ).a;\n\n\t\t\t// Is there any blending weight with a value greater than 0.0?\n\t\t\tif ( dot(a, vec4( 1.0, 1.0, 1.0, 1.0 )) < 1e-5 ) {\n\t\t\t\treturn texture2D( colorTex, texcoord, 0.0 );\n\t\t\t} else {\n\t\t\t\t// Up to 4 lines can be crossing a pixel (one through each edge). We\n\t\t\t\t// favor blending by choosing the line with the maximum weight for each\n\t\t\t\t// direction:\n\t\t\t\tvec2 offset;\n\t\t\t\toffset.x = a.a > a.b ? a.a : -a.b; // left vs. right\n\t\t\t\toffset.y = a.g > a.r ? -a.g : a.r; // top vs. bottom // WebGL port note: Changed signs\n\n\t\t\t\t// Then we go in the direction that has the maximum weight:\n\t\t\t\tif ( abs( offset.x ) > abs( offset.y )) { // horizontal vs. vertical\n\t\t\t\t\toffset.y = 0.0;\n\t\t\t\t} else {\n\t\t\t\t\toffset.x = 0.0;\n\t\t\t\t}\n\n\t\t\t\t// Fetch the opposite color and lerp by hand:\n\t\t\t\tvec4 C = texture2D( colorTex, texcoord, 0.0 );\n\t\t\t\ttexcoord += sign( offset ) * resolution;\n\t\t\t\tvec4 Cop = texture2D( colorTex, texcoord, 0.0 );\n\t\t\t\tfloat s = abs( offset.x ) > abs( offset.y ) ? abs( offset.x ) : abs( offset.y );\n\n\t\t\t\t// WebGL port note: Added gamma correction\n\t\t\t\tC.xyz = pow(C.xyz, vec3(2.2));\n\t\t\t\tCop.xyz = pow(Cop.xyz, vec3(2.2));\n\t\t\t\tvec4 mixed = mix(C, Cop, s);\n\t\t\t\tmixed.xyz = pow(mixed.xyz, vec3(1.0 / 2.2));\n\n\t\t\t\treturn mixed;\n\t\t\t}\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = SMAANeighborhoodBlendingPS( vUv, vOffset, tColor, tDiffuse );\n\n\t\t}`\n\n};\n\nexport { SMAAEdgesShader, SMAAWeightsShader, SMAABlendShader };\n","import {\n\tLinearFilter,\n\tNearestFilter,\n\tShaderMaterial,\n\tTexture,\n\tUniformsUtils,\n\tWebGLRenderTarget\n} from 'three';\nimport { Pass, FullScreenQuad } from 'three/examples/jsm/postprocessing/Pass.js';\nimport { SMAAEdgesShader } from 'three/examples/jsm/shaders/SMAAShader.js';\nimport { SMAAWeightsShader } from 'three/examples/jsm/shaders/SMAAShader.js';\nimport { SMAABlendShader } from 'three/examples/jsm/shaders/SMAAShader.js';\n\nclass SMAAPass extends Pass {\n\n\tconstructor( width, height ) {\n\n\t\tsuper();\n\n\t\t// render targets\n\n\t\tthis.edgesRT = new WebGLRenderTarget( width, height, {\n\t\t\tdepthBuffer: false\n\t\t} );\n\t\tthis.edgesRT.texture.name = 'SMAAPass.edges';\n\n\t\tthis.weightsRT = new WebGLRenderTarget( width, height, {\n\t\t\tdepthBuffer: false\n\t\t} );\n\t\tthis.weightsRT.texture.name = 'SMAAPass.weights';\n\n\t\t// textures\n\t\tconst scope = this;\n\n\t\tconst areaTextureImage = new Image();\n\t\tareaTextureImage.crossOrigin = \"Anonymous\";\n\t\tareaTextureImage.src = this.getAreaTexture();\n\t\tareaTextureImage.onload = function () {\n\n\t\t\t// assigning data to HTMLImageElement.src is asynchronous (see #15162)\n\t\t\tscope.areaTexture.needsUpdate = true;\n\n\t\t};\n\n\t\tthis.areaTexture = new Texture();\n\t\tthis.areaTexture.name = 'SMAAPass.area';\n\t\tthis.areaTexture.image = areaTextureImage;\n\t\tthis.areaTexture.minFilter = LinearFilter;\n\t\tthis.areaTexture.generateMipmaps = false;\n\t\tthis.areaTexture.flipY = false;\n\n\t\tconst searchTextureImage = new Image();\n\t\tsearchTextureImage.crossOrigin = \"Anonymous\";\n\t\tsearchTextureImage.src = this.getSearchTexture();\n\t\tsearchTextureImage.onload = function () {\n\n\t\t\t// assigning data to HTMLImageElement.src is asynchronous (see #15162)\n\t\t\tscope.searchTexture.needsUpdate = true;\n\n\t\t};\n\n\t\tthis.searchTexture = new Texture();\n\t\tthis.searchTexture.name = 'SMAAPass.search';\n\t\tthis.searchTexture.image = searchTextureImage;\n\t\tthis.searchTexture.magFilter = NearestFilter;\n\t\tthis.searchTexture.minFilter = NearestFilter;\n\t\tthis.searchTexture.generateMipmaps = false;\n\t\tthis.searchTexture.flipY = false;\n\n\t\t// materials - pass 1\n\n\t\tif ( SMAAEdgesShader === undefined ) {\n\n\t\t\tconsole.error( 'THREE.SMAAPass relies on SMAAShader' );\n\n\t\t}\n\n\t\tthis.uniformsEdges = UniformsUtils.clone( SMAAEdgesShader.uniforms );\n\n\t\tthis.uniformsEdges[ 'resolution' ].value.set( 1 / width, 1 / height );\n\n\t\tthis.materialEdges = new ShaderMaterial( {\n\t\t\tdefines: Object.assign( {}, SMAAEdgesShader.defines ),\n\t\t\tuniforms: this.uniformsEdges,\n\t\t\tvertexShader: SMAAEdgesShader.vertexShader,\n\t\t\tfragmentShader: SMAAEdgesShader.fragmentShader\n\t\t} );\n\n\t\t// materials - pass 2\n\n\t\tthis.uniformsWeights = UniformsUtils.clone( SMAAWeightsShader.uniforms );\n\n\t\tthis.uniformsWeights[ 'resolution' ].value.set( 1 / width, 1 / height );\n\t\tthis.uniformsWeights[ 'tDiffuse' ].value = this.edgesRT.texture;\n\t\tthis.uniformsWeights[ 'tArea' ].value = this.areaTexture;\n\t\tthis.uniformsWeights[ 'tSearch' ].value = this.searchTexture;\n\n\t\tthis.materialWeights = new ShaderMaterial( {\n\t\t\tdefines: Object.assign( {}, SMAAWeightsShader.defines ),\n\t\t\tuniforms: this.uniformsWeights,\n\t\t\tvertexShader: SMAAWeightsShader.vertexShader,\n\t\t\tfragmentShader: SMAAWeightsShader.fragmentShader\n\t\t} );\n\n\t\t// materials - pass 3\n\n\t\tthis.uniformsBlend = UniformsUtils.clone( SMAABlendShader.uniforms );\n\n\t\tthis.uniformsBlend[ 'resolution' ].value.set( 1 / width, 1 / height );\n\t\tthis.uniformsBlend[ 'tDiffuse' ].value = this.weightsRT.texture;\n\n\t\tthis.materialBlend = new ShaderMaterial( {\n\t\t\tuniforms: this.uniformsBlend,\n\t\t\tvertexShader: SMAABlendShader.vertexShader,\n\t\t\tfragmentShader: SMAABlendShader.fragmentShader\n\t\t} );\n\n\t\tthis.needsSwap = false;\n\n\t\tthis.fsQuad = new FullScreenQuad( null );\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer/*, deltaTime, maskActive*/ ) {\n\n\t\t// pass 1\n\n\t\tthis.uniformsEdges[ 'tDiffuse' ].value = readBuffer.texture;\n\n\t\tthis.fsQuad.material = this.materialEdges;\n\n\t\trenderer.setRenderTarget( this.edgesRT );\n\t\tif ( this.clear ) renderer.clear();\n\t\tthis.fsQuad.render( renderer );\n\n\t\t// pass 2\n\n\t\tthis.fsQuad.material = this.materialWeights;\n\n\t\trenderer.setRenderTarget( this.weightsRT );\n\t\tif ( this.clear ) renderer.clear();\n\t\tthis.fsQuad.render( renderer );\n\n\t\t// pass 3\n\n\t\tthis.uniformsBlend[ 'tColor' ].value = readBuffer.texture;\n\n\t\tthis.fsQuad.material = this.materialBlend;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( writeBuffer );\n\t\t\tif ( this.clear ) renderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t}\n\n\t}\n\n\tsetSize( width, height ) {\n\n\t\tthis.edgesRT.setSize( width, height );\n\t\tthis.weightsRT.setSize( width, height );\n\n\t\tthis.materialEdges.uniforms[ 'resolution' ].value.set( 1 / width, 1 / height );\n\t\tthis.materialWeights.uniforms[ 'resolution' ].value.set( 1 / width, 1 / height );\n\t\tthis.materialBlend.uniforms[ 'resolution' ].value.set( 1 / width, 1 / height );\n\n\t}\n\n\tgetAreaTexture() {\n\n\t\treturn 'data:image/png;base64,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';\n\n\t}\n\n\tgetSearchTexture() {\n\n\t\treturn 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAAAhCAAAAABIXyLAAAAAOElEQVRIx2NgGAWjYBSMglEwEICREYRgFBZBqDCSLA2MGPUIVQETE9iNUAqLR5gIeoQKRgwXjwAAGn4AtaFeYLEAAAAASUVORK5CYII=';\n\n\t}\n\n dispose(){\n this.edgesRT.dispose();\n this.weightsRT.dispose();\n }\n\n}\n\nexport { SMAAPass };\n","/**\n * Gamma Correction Shader\n * http://en.wikipedia.org/wiki/gamma_correction\n */\n\nconst GammaCorrectionShader = {\n\n\tname: 'GammaCorrectionShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 tex = texture2D( tDiffuse, vUv );\n\n\t\t\tgl_FragColor = sRGBTransferOETF( tex );\n\n\t\t}`\n\n};\n\nexport { GammaCorrectionShader };\n","import {\n\tColor\n} from 'three';\n\n/**\n * Luminosity\n * http://en.wikipedia.org/wiki/Luminosity\n */\n\nconst LuminosityHighPassShader = {\n\n\tname: 'LuminosityHighPassShader',\n\n\tshaderID: 'luminosityHighPass',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'luminosityThreshold': { value: 1.0 },\n\t\t'smoothWidth': { value: 1.0 },\n\t\t'defaultColor': { value: new Color( 0x000000 ) },\n\t\t'defaultOpacity': { value: 0.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform vec3 defaultColor;\n\t\tuniform float defaultOpacity;\n\t\tuniform float luminosityThreshold;\n\t\tuniform float smoothWidth;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\n\t\t\tvec3 luma = vec3( 0.299, 0.587, 0.114 );\n\n\t\t\tfloat v = dot( texel.xyz, luma );\n\n\t\t\tvec4 outputColor = vec4( defaultColor.rgb, defaultOpacity );\n\n\t\t\tfloat alpha = smoothstep( luminosityThreshold, luminosityThreshold + smoothWidth, v );\n\n\t\t\tgl_FragColor = mix( outputColor, texel, alpha );\n\n\t\t}`\n\n};\n\nexport { LuminosityHighPassShader };\n","import {\n\tAdditiveBlending,\n\tColor,\n\tFloatType,\n\tLinearFilter,\n\tMeshBasicMaterial,\n\tRGBAFormat,\n\tShaderMaterial,\n\tUniformsUtils,\n\tVector2,\n\tVector3,\n\tWebGLRenderTarget\n} from 'three';\nimport { Pass, FullScreenQuad } from 'three/examples/jsm/postprocessing/Pass.js';\nimport { CopyShader } from 'three/examples/jsm/shaders/CopyShader.js';\nimport { LuminosityHighPassShader } from 'three/examples/jsm/shaders/LuminosityHighPassShader.js';\n\n/**\n * UnrealBloomPass is inspired by the bloom pass of Unreal Engine. It creates a\n * mip map chain of bloom textures and blurs them with different radii. Because\n * of the weighted combination of mips, and because larger blurs are done on\n * higher mips, this effect provides good quality and performance.\n *\n * Reference:\n * - https://docs.unrealengine.com/latest/INT/Engine/Rendering/PostProcessEffects/Bloom/\n */\nclass TransparentUnrealBloomPass extends Pass {\n\n\tconstructor( resolution, strength, radius, threshold ) {\n\n\t\tsuper();\n\n\t\tthis.strength = ( strength !== undefined ) ? strength : 1;\n\t\tthis.radius = radius;\n\t\tthis.threshold = threshold;\n\t\tthis.resolution = ( resolution !== undefined ) ? new Vector2( resolution.x, resolution.y ) : new Vector2( 256, 256 );\n\n\t\t// create color only once here, reuse it later inside the render function\n\t\tthis.clearColor = new Color( 0, 0, 0);\n\n\t\t// render targets\n\t\tconst pars = { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat, type: FloatType, stencilBuffer: false };\n\t\tthis.renderTargetsHorizontal = [];\n\t\tthis.renderTargetsVertical = [];\n\t\tthis.nMips = 5;\n\t\tlet resx = Math.round( this.resolution.x / 2 );\n\t\tlet resy = Math.round( this.resolution.y / 2 );\n\n\t\tthis.renderTargetBright = new WebGLRenderTarget( resx, resy, pars );\n\t\tthis.renderTargetBright.texture.name = 'UnrealBloomPass.bright';\n\t\tthis.renderTargetBright.texture.generateMipmaps = false;\n\n\t\tfor ( let i = 0; i < this.nMips; i ++ ) {\n\n\t\t\tconst renderTargetHorizonal = new WebGLRenderTarget( resx, resy, pars );\n\n\t\t\trenderTargetHorizonal.texture.name = 'UnrealBloomPass.h' + i;\n\t\t\trenderTargetHorizonal.texture.generateMipmaps = false;\n\n\t\t\tthis.renderTargetsHorizontal.push( renderTargetHorizonal );\n\n\t\t\tconst renderTargetVertical = new WebGLRenderTarget( resx, resy, pars );\n\n\t\t\trenderTargetVertical.texture.name = 'UnrealBloomPass.v' + i;\n\t\t\trenderTargetVertical.texture.generateMipmaps = false;\n\n\t\t\tthis.renderTargetsVertical.push( renderTargetVertical );\n\n\t\t\tresx = Math.round( resx / 2 );\n\n\t\t\tresy = Math.round( resy / 2 );\n\n\t\t}\n\n\t\t// luminosity high pass material\n\n\t\tif ( LuminosityHighPassShader === undefined )\n\t\t\tconsole.error( 'THREE.UnrealBloomPass relies on LuminosityHighPassShader' );\n\n\t\tconst highPassShader = LuminosityHighPassShader;\n\t\tthis.highPassUniforms = UniformsUtils.clone( highPassShader.uniforms );\n\n\t\tthis.highPassUniforms[ 'luminosityThreshold' ].value = threshold;\n\t\tthis.highPassUniforms[ 'smoothWidth' ].value = 0.01;\n\n\t\tthis.materialHighPassFilter = new ShaderMaterial( {\n\t\t\tuniforms: this.highPassUniforms,\n\t\t\tvertexShader: highPassShader.vertexShader,\n\t\t\tfragmentShader: highPassShader.fragmentShader,\n\t\t\tdefines: {}\n\t\t} );\n\n\t\t// Gaussian Blur Materials\n\t\tthis.separableBlurMaterials = [];\n\t\tconst kernelSizeArray = [ 3, 5, 7, 9, 11 ];\n\t\tresx = Math.round( this.resolution.x / 2 );\n\t\tresy = Math.round( this.resolution.y / 2 );\n\n\t\tfor ( let i = 0; i < this.nMips; i ++ ) {\n\n\t\t\tthis.separableBlurMaterials.push( this.getSeperableBlurMaterial( kernelSizeArray[ i ] ) );\n\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'texSize' ].value = new Vector2( resx, resy );\n\n\t\t\tresx = Math.round( resx / 2 );\n\n\t\t\tresy = Math.round( resy / 2 );\n\n\t\t}\n\n\t\t// Composite material\n\t\tthis.compositeMaterial = this.getCompositeMaterial( this.nMips );\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture1' ].value = this.renderTargetsVertical[ 0 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture2' ].value = this.renderTargetsVertical[ 1 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture3' ].value = this.renderTargetsVertical[ 2 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture4' ].value = this.renderTargetsVertical[ 3 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture5' ].value = this.renderTargetsVertical[ 4 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'bloomStrength' ].value = strength;\n\t\tthis.compositeMaterial.uniforms[ 'bloomRadius' ].value = 0.1;\n\t\tthis.compositeMaterial.needsUpdate = true;\n\n\t\tconst bloomFactors = [ 1.0, 0.8, 0.6, 0.4, 0.2 ];\n\t\tthis.compositeMaterial.uniforms[ 'bloomFactors' ].value = bloomFactors;\n\t\tthis.bloomTintColors = [ new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ) ];\n\t\tthis.compositeMaterial.uniforms[ 'bloomTintColors' ].value = this.bloomTintColors;\n\n\t\t// copy material\n\t\tif ( CopyShader === undefined ) {\n\n\t\t\tconsole.error( 'THREE.UnrealBloomPass relies on CopyShader' );\n\n\t\t}\n\n\t\tconst copyShader = CopyShader;\n\n\t\tthis.copyUniforms = UniformsUtils.clone( copyShader.uniforms );\n\t\tthis.copyUniforms[ 'opacity' ].value = 1.0;\n\n\t\tthis.materialCopy = new ShaderMaterial( {\n\t\t\tuniforms: this.copyUniforms,\n\t\t\tvertexShader: copyShader.vertexShader,\n\t\t\tfragmentShader: copyShader.fragmentShader,\n\t\t\tblending: AdditiveBlending,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\ttransparent: true\n\t\t} );\n\n\t\tthis.enabled = true;\n\t\tthis.needsSwap = false;\n\n\t\tthis._oldClearColor = new Color();\n\t\tthis.oldClearAlpha = 1;\n\n\t\tthis.basic = new MeshBasicMaterial();\n\n\t\tthis.fsQuad = new FullScreenQuad( null );\n\n\t}\n\n\tdispose() {\n\n\t\tfor ( let i = 0; i < this.renderTargetsHorizontal.length; i ++ ) {\n\n\t\t\tthis.renderTargetsHorizontal[ i ].dispose();\n\n\t\t}\n\n\t\tfor ( let i = 0; i < this.renderTargetsVertical.length; i ++ ) {\n\n\t\t\tthis.renderTargetsVertical[ i ].dispose();\n\n\t\t}\n\n\t\tthis.renderTargetBright.dispose();\n\n\t\tfor ( let i = 0; i < this.separableBlurMaterials.length; i ++ ) {\n\n\t\t\tthis.separableBlurMaterials[ i ].dispose();\n\n\t\t}\n\n\t\tthis.compositeMaterial.dispose();\n\t\tthis.materialCopy.dispose();\n\t\tthis.basic.dispose();\n\n\t\t//\n\n\t\tthis.fsQuad.dispose();\n\n\t}\n\n\tsetSize( width, height ) {\n\n\t\tlet resx = Math.round( width / 2 );\n\t\tlet resy = Math.round( height / 2 );\n\n\t\tthis.renderTargetBright.setSize( resx, resy );\n\n\t\tfor ( let i = 0; i < this.nMips; i ++ ) {\n\n\t\t\tthis.renderTargetsHorizontal[ i ].setSize( resx, resy );\n\t\t\tthis.renderTargetsVertical[ i ].setSize( resx, resy );\n\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'texSize' ].value = new Vector2( resx, resy );\n\n\t\t\tresx = Math.round( resx / 2 );\n\t\t\tresy = Math.round( resy / 2 );\n\n\t\t}\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer, deltaTime, maskActive ) {\n\t\trenderer.getClearColor( this._oldClearColor );\n\t\tthis.oldClearAlpha = renderer.getClearAlpha();\n\t\tconst oldAutoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\trenderer.setClearColor( this.clearColor, 0 );\n\n\t\tif ( maskActive ) renderer.state.buffers.stencil.setTest( false );\n\n\t\t// Render input to screen\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\tthis.fsQuad.material = this.basic;\n\t\t\tthis.basic.map = readBuffer.texture;\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t}\n\n\t\t// 1. Extract Bright Areas\n\n\t\tthis.highPassUniforms[ 'tDiffuse' ].value = readBuffer.texture;\n\t\tthis.highPassUniforms[ 'luminosityThreshold' ].value = this.threshold;\n\t\tthis.fsQuad.material = this.materialHighPassFilter;\n\n\t\trenderer.setRenderTarget( this.renderTargetBright );\n\t\trenderer.clear();\n\t\tthis.fsQuad.render( renderer );\n\n\t\t// 2. Blur All the mips progressively\n\n\t\tlet inputRenderTarget = this.renderTargetBright;\n\n\t\tfor ( let i = 0; i < this.nMips; i ++ ) {\n\n\t\t\tthis.fsQuad.material = this.separableBlurMaterials[ i ];\n\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'colorTexture' ].value = inputRenderTarget.texture;\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'direction' ].value = TransparentUnrealBloomPass.BlurDirectionX;\n\t\t\trenderer.setRenderTarget( this.renderTargetsHorizontal[ i ] );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'colorTexture' ].value = this.renderTargetsHorizontal[ i ].texture;\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'direction' ].value = TransparentUnrealBloomPass.BlurDirectionY;\n\t\t\trenderer.setRenderTarget( this.renderTargetsVertical[ i ] );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t\tinputRenderTarget = this.renderTargetsVertical[ i ];\n\n\t\t}\n\n\t\t// Composite All the mips\n\n\t\tthis.fsQuad.material = this.compositeMaterial;\n\t\tthis.compositeMaterial.uniforms[ 'bloomStrength' ].value = this.strength;\n\t\tthis.compositeMaterial.uniforms[ 'bloomRadius' ].value = this.radius;\n\t\tthis.compositeMaterial.uniforms[ 'bloomTintColors' ].value = this.bloomTintColors;\n\n\t\trenderer.setRenderTarget( this.renderTargetsHorizontal[ 0 ] );\n\t\trenderer.clear();\n\t\tthis.fsQuad.render( renderer );\n\n\t\t// Blend it additively over the input texture\n\n\t\tthis.fsQuad.material = this.materialCopy;\n\t\tthis.copyUniforms[ 'tDiffuse' ].value = this.renderTargetsHorizontal[ 0 ].texture;\n\n\t\tif ( maskActive ) renderer.state.buffers.stencil.setTest( true );\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( readBuffer );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t}\n\n\t\t// Restore renderer settings\n\n\t\trenderer.setClearColor( this._oldClearColor, this.oldClearAlpha );\n\t\trenderer.autoClear = oldAutoClear;\n\n\t}\n\n\tgetSeperableBlurMaterial( kernelRadius ) {\n\n\t\treturn new ShaderMaterial( {\n\n\t\t\tdefines: {\n\t\t\t\t'KERNEL_RADIUS': kernelRadius,\n\t\t\t\t'SIGMA': kernelRadius\n\t\t\t},\n\n\t\t\tuniforms: {\n\t\t\t\t'colorTexture': { value: null },\n\t\t\t\t'texSize': { value: new Vector2( 0.5, 0.5 ) },\n\t\t\t\t'direction': { value: new Vector2( 0.5, 0.5 ) }\n\t\t\t},\n\n\t\t\tvertexShader:\n\t\t\t\t`varying vec2 vUv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\n\t\t\tfragmentShader:\n\t\t\t\t`#include <common>\n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tuniform sampler2D colorTexture;\n\t\t\t\tuniform vec2 texSize;\n\t\t\t\tuniform vec2 direction;\n\n\t\t\t\tfloat gaussianPdf(in float x, in float sigma) {\n\t\t\t\t\treturn 0.39894 * exp( -0.5 * x * x/( sigma * sigma))/sigma;\n\t\t\t\t}\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec2 invSize = 1.0 / texSize;\n\t\t\t\t\tfloat fSigma = float(SIGMA);\n\t\t\t\t\tfloat weightSum = gaussianPdf(0.0, fSigma);\n float alphaSum = 0.0;\n\t\t\t\t\tvec3 diffuseSum = texture2D( colorTexture, vUv).rgb * weightSum;\n\t\t\t\t\tfor( int i = 1; i < KERNEL_RADIUS; i ++ ) {\n\t\t\t\t\t\tfloat x = float(i);\n\t\t\t\t\t\tfloat w = gaussianPdf(x, fSigma);\n\t\t\t\t\t\tvec2 uvOffset = direction * invSize * x;\n\t\t\t\t\t\tvec4 sample1 = texture2D( colorTexture, vUv + uvOffset);\n\t\t\t\t\t\tvec4 sample2 = texture2D( colorTexture, vUv - uvOffset);\n\t\t\t\t\t\tdiffuseSum += (sample1.rgb + sample2.rgb) * w;\n alphaSum += (sample1.a + sample2.a) * w;\n\t\t\t\t\t\tweightSum += 2.0 * w;\n\t\t\t\t\t}\n\t\t\t\t\tgl_FragColor = vec4(diffuseSum/weightSum, alphaSum/weightSum);\n\t\t\t\t}`\n\t\t} );\n\n\t}\n\n\tgetCompositeMaterial( nMips ) {\n\n\t\treturn new ShaderMaterial( {\n\n\t\t\tdefines: {\n\t\t\t\t'NUM_MIPS': nMips\n\t\t\t},\n\n\t\t\tuniforms: {\n\t\t\t\t'blurTexture1': { value: null },\n\t\t\t\t'blurTexture2': { value: null },\n\t\t\t\t'blurTexture3': { value: null },\n\t\t\t\t'blurTexture4': { value: null },\n\t\t\t\t'blurTexture5': { value: null },\n\t\t\t\t'dirtTexture': { value: null },\n\t\t\t\t'bloomStrength': { value: 1.0 },\n\t\t\t\t'bloomFactors': { value: null },\n\t\t\t\t'bloomTintColors': { value: null },\n\t\t\t\t'bloomRadius': { value: 0.0 }\n\t\t\t},\n\n\t\t\tvertexShader:\n\t\t\t\t`varying vec2 vUv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\n\t\t\tfragmentShader:\n\t\t\t\t`varying vec2 vUv;\n\t\t\t\tuniform sampler2D blurTexture1;\n\t\t\t\tuniform sampler2D blurTexture2;\n\t\t\t\tuniform sampler2D blurTexture3;\n\t\t\t\tuniform sampler2D blurTexture4;\n\t\t\t\tuniform sampler2D blurTexture5;\n\t\t\t\tuniform sampler2D dirtTexture;\n\t\t\t\tuniform float bloomStrength;\n\t\t\t\tuniform float bloomRadius;\n\t\t\t\tuniform float bloomFactors[NUM_MIPS];\n\t\t\t\tuniform vec3 bloomTintColors[NUM_MIPS];\n\n\t\t\t\tfloat lerpBloomFactor(const in float factor) {\n\t\t\t\t\tfloat mirrorFactor = 1.2 - factor;\n\t\t\t\t\treturn mix(factor, mirrorFactor, bloomRadius);\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tgl_FragColor = bloomStrength * ( lerpBloomFactor(bloomFactors[0]) * vec4(bloomTintColors[0], 1.0) * texture2D(blurTexture1, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[1]) * vec4(bloomTintColors[1], 1.0) * texture2D(blurTexture2, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[2]) * vec4(bloomTintColors[2], 1.0) * texture2D(blurTexture3, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[3]) * vec4(bloomTintColors[3], 1.0) * texture2D(blurTexture4, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[4]) * vec4(bloomTintColors[4], 1.0) * texture2D(blurTexture5, vUv) );\n\t\t\t\t}`\n\t\t} );\n\n\t}\n\n}\n\nTransparentUnrealBloomPass.BlurDirectionX = new Vector2( 1.0, 0.0 );\nTransparentUnrealBloomPass.BlurDirectionY = new Vector2( 0.0, 1.0 );\n\nexport { TransparentUnrealBloomPass };\n","import { DICE_MODELS } from './DiceModels.js';\nimport { DiceSFXManager } from './DiceSFXManager.js';\nimport { RendererStats } from './libs/threex.rendererstats.js';\n//import {GLTFExporter} from 'three/examples/jsm/loaders/exporters/GLTFExporter.js';\nimport { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js';\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js';\nimport { ShaderPass } from 'three/examples/jsm/postprocessing/ShaderPass.js';\nimport { OutlinePass } from 'three/examples/jsm/postprocessing/OutlinePass.js';\nimport { SMAAPass } from './libs/SMAAPass.js';\nimport { GammaCorrectionShader } from 'three/examples/jsm/shaders/GammaCorrectionShader.js';\nimport { TransparentUnrealBloomPass } from './libs/TransparentUnrealBloomPass.js';\n\nimport * as THREE from 'three';\n\n\nexport class DiceBox {\n\n\tconstructor(element_container, dice_factory, config) {\n\t\t//private variables\n\t\tthis.known_types = ['d4', 'd6', 'd8', 'd10', 'd12', 'd14', 'd16', 'd20', 'd24', 'd30', 'd100'];\n\t\tthis.container = element_container;\n\t\tthis.dimensions = config.dimensions;\n\t\tthis.dicefactory = dice_factory;\n\t\tthis.config = config;\n\t\tthis.speed = 1;\n\t\tthis.isVisible = false;\n\t\tthis.last_time = 0;\n\t\tthis.running = false;\n\t\tthis.allowInteractivity = false;\n\t\tthis.raycaster = new THREE.Raycaster();\n\t\tthis.blackColor = new THREE.Color(0, 0, 0);\n\t\tthis.nbIterationsBetweenRolls = 15;\n\n\t\tthis.display = {\n\t\t\tcurrentWidth: null,\n\t\t\tcurrentHeight: null,\n\t\t\tcontainerWidth: null,\n\t\t\tcontainerHeight: null,\n\t\t\taspect: null,\n\t\t\tscale: null\n\t\t};\n\n\t\tthis.mouse = {\n\t\t\tpos: new THREE.Vector2(),\n\t\t\tstartDrag: undefined,\n\t\t\tstartDragTime: undefined,\n\t\t\tconstraintDown: false,\n\t\t\tconstraint: null\n\t\t};\n\n\t\tthis.cameraHeight = {\n\t\t\tmax: null,\n\t\t\tclose: null,\n\t\t\tmedium: null,\n\t\t\tfar: null\n\t\t};\n\n\n\t\tthis.clock = new THREE.Clock();\n\t\tthis.world_sim = new CANNON.World();\n\t\tthis.dice_body_material = new CANNON.Material();\n\t\tthis.desk_body_material = new CANNON.Material();\n\t\tthis.barrier_body_material = new CANNON.Material();\n\t\tthis.sounds_table = {};\n\t\tthis.sounds_dice = {};\n\t\tthis.sounds_coins = [];\n\t\tthis.lastSoundType = '';\n\t\tthis.lastSoundStep = 0;\n\t\tthis.lastSound = 0;\n\t\tthis.iteration;\n\t\tthis.renderer;\n\t\tthis.barrier;\n\t\tthis.camera;\n\t\tthis.light;\n\t\tthis.light_amb;\n\t\tthis.desk;\n\t\tthis.pane;\n\n\t\t//public variables\n\t\tthis.public_interface = {};\n\t\tthis.diceList = []; //'private' variable\n\t\tthis.deadDiceList = [];\n\t\tthis.framerate = (1 / 60);\n\t\tthis.sounds = true;\n\t\tthis.volume = 1;\n\t\tthis.soundDelay = 1; // time between sound effects in worldstep\n\t\tthis.soundsSurface = \"felt\";\n\t\tthis.animstate = '';\n\t\tthis.throwingForce = \"medium\";\n\t\tthis.immersiveDarkness = true;\n\t\tthis.toneMappingExposureDefault = 1.0;\n\n\t\tthis.selector = {\n\t\t\tanimate: true,\n\t\t\trotate: true,\n\t\t\tintersected: null,\n\t\t\tdice: []\n\t\t};\n\t\tthis.showExtraDice = false;\n\t\tthis.muteSoundSecretRolls = false;\n\n\t\tthis.colors = {\n\t\t\tambient: 0xffeeb1,\n\t\t\tspotlight: 0x000000,\n\t\t\tground: 0x080820\n\t\t};\n\n\t\tthis.rethrowFunctions = {};\n\t\tthis.afterThrowFunctions = {};\n\n\t}\n\n\tpreloadSounds() {\n\t\t//Surfaces\n\t\tfetch(`modules/dice-so-nice/sounds/surfaces.json`).then(res => {\n\t\t\tres.json().then(json => {\n\t\t\t\tAudioHelper.preloadSound(`modules/dice-so-nice/sounds/${json.resources[0]}`).then(src => this.sounds_table.source = src);\n\t\t\t\tObject.entries(json.spritemap).forEach(sound => {\n\t\t\t\t\tlet type = sound[0].match(/surface\\_([a-z\\_]*)/)[1];\n\t\t\t\t\tif (!this.sounds_table[type])\n\t\t\t\t\t\tthis.sounds_table[type] = [];\n\t\t\t\t\tthis.sounds_table[type].push(sound[1]);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t//Hits\n\t\tfetch(`modules/dice-so-nice/sounds/dicehit.json`).then(res => {\n\t\t\tres.json().then(json => {\n\t\t\t\tthis.sounds_dice.source = AudioHelper.preloadSound(`modules/dice-so-nice/sounds/${json.resources[0]}`).then(src => this.sounds_dice.source = src);\n\t\t\t\tObject.entries(json.spritemap).forEach(sound => {\n\t\t\t\t\tlet type = sound[0].match(/dicehit\\_([a-z\\_]*)/)[1];\n\t\t\t\t\tif (!this.sounds_dice[type])\n\t\t\t\t\t\tthis.sounds_dice[type] = [];\n\t\t\t\t\tthis.sounds_dice[type].push(sound[1]);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\tplayAudioSprite(source, sprite, selfVolume) {\n\t\tif (!source || !source.context)\n\t\t\treturn false;\n\t\tlet gainNode = source.context.createGain();\n\t\tgainNode.gain.value = selfVolume * this.volume * game.settings.get(\"core\", \"globalInterfaceVolume\");\n\t\tconst startTime = sprite.start;\n\t\tconst duration = sprite.end - sprite.start;\n\t\tconst sampleSource = source.context.createBufferSource();\n\t\tsampleSource.buffer = source.container.buffer;\n\t\tsampleSource.connect(gainNode).connect(source.context.destination);\n\t\tsampleSource.start(source.context.currentTime, startTime, duration);\n\t}\n\n\tinitialize() {\n\t\treturn new Promise(async resolve => {\n\t\t\tgame.audio.pending.push(this.preloadSounds.bind(this));\n\n\t\t\tawait this.dicefactory.preloadPresets();\n\n\t\t\tthis.sounds = this.config.sounds == '1';\n\t\t\tthis.volume = this.config.soundsVolume;\n\t\t\tthis.soundsSurface = this.config.soundsSurface;\n\t\t\tthis.showExtraDice = this.config.showExtraDice;\n\t\t\tthis.muteSoundSecretRolls = this.config.muteSoundSecretRolls;\n\n\t\t\tthis.allowInteractivity = this.config.boxType == \"board\" && game.settings.get(\"dice-so-nice\", \"allowInteractivity\");\n\n\t\t\tthis.dicefactory.setQualitySettings(this.config);\n\t\t\tlet globalAnimationSpeed = game.settings.get(\"dice-so-nice\", \"globalAnimationSpeed\");\n\t\t\tif (globalAnimationSpeed === \"0\")\n\t\t\t\tthis.speed = this.config.speed;\n\t\t\telse\n\t\t\t\tthis.speed = parseInt(globalAnimationSpeed, 10);\n\t\t\tthis.throwingForce = this.config.throwingForce;\n\t\t\tthis.immersiveDarkness = this.config.immersiveDarkness;\n\t\t\tthis.scene = new THREE.Scene();\n\t\t\tif (game.dice3d.dice3dRenderers[this.config.boxType] != null) {\n\t\t\t\tthis.renderer = game.dice3d.dice3dRenderers[this.config.boxType];\n\t\t\t\tthis.scene.environment = this.renderer.scopedTextureCache.textureCube;\n\t\t\t\tthis.scene.traverse(object => {\n\t\t\t\t\tif (object.type === 'Mesh') object.material.needsUpdate = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst preserveDrawingBuffer = game.user.getFlag(\"dice-so-nice\", \"preserveDrawingBuffer\") || false;\n\t\t\t\tthis.renderer = new THREE.WebGLRenderer({ antialias: false, alpha: true, powerPreference: \"high-performance\", preserveDrawingBuffer: preserveDrawingBuffer});\n\t\t\t\tif (this.dicefactory.useHighDPI)\n\t\t\t\t\tthis.renderer.setPixelRatio(window.devicePixelRatio);\n\t\t\t\tif (this.dicefactory.realisticLighting) {\n\t\t\t\t\tthis.renderer.toneMapping = THREE.ACESFilmicToneMapping;\n\t\t\t\t\tthis.renderer.toneMappingExposure = this.toneMappingExposureDefault;\n\t\t\t\t}\n\t\t\t\tconst capabilities = this.renderer.capabilities;\n\t\t\t\tthis.anisotropy = capabilities.getMaxAnisotropy() < 16 ? capabilities.getMaxAnisotropy() : 16;\n\t\t\t\tawait this.loadContextScopedTextures(this.config.boxType);\n\t\t\t\tthis.dicefactory.initializeMaterials();\n\t\t\t\tgame.dice3d.dice3dRenderers[this.config.boxType] = this.renderer;\n\t\t\t}\n\n\t\t\tif (false && this.config.boxType == \"board\") {\n\t\t\t\tthis.rendererStats = new RendererStats()\n\n\t\t\t\tthis.rendererStats.domElement.style.position = 'absolute';\n\t\t\t\tthis.rendererStats.domElement.style.left = '44px';\n\t\t\t\tthis.rendererStats.domElement.style.bottom = '178px';\n\t\t\t\tthis.rendererStats.domElement.style.transform = 'scale(2)';\n\t\t\t\tdocument.body.appendChild(this.rendererStats.domElement);\n\t\t\t}\n\n\t\t\tthis.container.appendChild(this.renderer.domElement);\n\t\t\tthis.renderer.shadowMap.enabled = this.dicefactory.shadows;\n\t\t\tthis.renderer.shadowMap.type = this.dicefactory.shadowQuality == \"high\" ? THREE.PCFSoftShadowMap : THREE.PCFShadowMap;\n\t\t\tthis.renderer.setClearColor(0x000000, 0.0);\n\n\t\t\tthis.setScene(this.config.dimensions);\n\n\t\t\tthis.world_sim.gravity.set(0, 0, -9.8 * 800);\n\t\t\tthis.world_sim.broadphase = new CANNON.NaiveBroadphase();\n\t\t\tthis.world_sim.solver.iterations = 14;\n\t\t\tthis.world_sim.allowSleep = true;\n\n\t\t\tlet contactMaterial = new CANNON.ContactMaterial(this.desk_body_material, this.dice_body_material, { friction: 0.01, restitution: 0.5 });\n\t\t\tthis.world_sim.addContactMaterial(contactMaterial);\n\t\t\tcontactMaterial = new CANNON.ContactMaterial(this.barrier_body_material, this.dice_body_material, { friction: 0, restitution: 0.95 });\n\t\t\tthis.world_sim.addContactMaterial(contactMaterial);\n\t\t\tcontactMaterial = new CANNON.ContactMaterial(this.dice_body_material, this.dice_body_material, { friction: 0.01, restitution: 0.7 });\n\t\t\tthis.world_sim.addContactMaterial(contactMaterial);\n\t\t\tlet desk = new CANNON.Body({ allowSleep: false, mass: 0, shape: new CANNON.Plane(), material: this.desk_body_material });\n\t\t\tthis.world_sim.addBody(desk);\n\n\t\t\tlet barrier = new CANNON.Body({ allowSleep: false, mass: 0, shape: new CANNON.Plane(), material: this.barrier_body_material });\n\t\t\tbarrier.quaternion.setFromAxisAngle(new CANNON.Vec3(1, 0, 0), Math.PI / 2);\n\t\t\tbarrier.position.set(0, this.display.containerHeight * 0.93, 0);\n\t\t\tthis.world_sim.addBody(barrier);\n\n\t\t\tbarrier = new CANNON.Body({ allowSleep: false, mass: 0, shape: new CANNON.Plane(), material: this.barrier_body_material });\n\t\t\tbarrier.quaternion.setFromAxisAngle(new CANNON.Vec3(1, 0, 0), -Math.PI / 2);\n\t\t\tbarrier.position.set(0, -this.display.containerHeight * 0.93, 0);\n\t\t\tthis.world_sim.addBody(barrier);\n\n\t\t\tbarrier = new CANNON.Body({ allowSleep: false, mass: 0, shape: new CANNON.Plane(), material: this.barrier_body_material });\n\t\t\tbarrier.quaternion.setFromAxisAngle(new CANNON.Vec3(0, 1, 0), -Math.PI / 2);\n\t\t\tbarrier.position.set(this.display.containerWidth * 0.93, 0, 0);\n\t\t\tthis.world_sim.addBody(barrier);\n\n\t\t\tbarrier = new CANNON.Body({ allowSleep: false, mass: 0, shape: new CANNON.Plane(), material: this.barrier_body_material });\n\t\t\tbarrier.quaternion.setFromAxisAngle(new CANNON.Vec3(0, 1, 0), Math.PI / 2);\n\t\t\tbarrier.position.set(-this.display.containerWidth * 0.93, 0, 0);\n\t\t\tthis.world_sim.addBody(barrier);\n\n\t\t\tlet shape = new CANNON.Sphere(0.1);\n\t\t\tthis.jointBody = new CANNON.Body({ mass: 0 });\n\t\t\tthis.jointBody.addShape(shape);\n\t\t\tthis.jointBody.collisionFilterGroup = 0;\n\t\t\tthis.jointBody.collisionFilterMask = 0;\n\t\t\tthis.world_sim.addBody(this.jointBody)\n\n\t\t\t//this.renderer.render(this.scene, this.camera);\n\t\t\tresolve();\n\t\t});\n\t}\n\n\tloadContextScopedTextures(type) {\n\t\treturn new Promise(resolve => {\n\t\t\tthis.renderer.scopedTextureCache = { type: type };\n\t\t\tif (this.dicefactory.realisticLighting) {\n\t\t\t\tlet textureLoader = new THREE.TextureLoader();\n\t\t\t\tthis.renderer.scopedTextureCache.roughnessMap_fingerprint = textureLoader.load('modules/dice-so-nice/textures/roughnessMap_finger.webp');\n\t\t\t\tthis.renderer.scopedTextureCache.roughnessMap_wood = textureLoader.load('modules/dice-so-nice/textures/roughnessMap_wood.webp');\n\t\t\t\tthis.renderer.scopedTextureCache.roughnessMap_metal = textureLoader.load('modules/dice-so-nice/textures/roughnessMap_metal.webp');\n\t\t\t\tthis.renderer.scopedTextureCache.roughnessMap_stone = textureLoader.load('modules/dice-so-nice/textures/roughnessMap_stone.webp');\n\n\t\t\t\t//set anisotropy\n\t\t\t\tthis.renderer.scopedTextureCache.roughnessMap_fingerprint.anisotropy = this.anisotropy;\n\t\t\t\tthis.renderer.scopedTextureCache.roughnessMap_wood.anisotropy = this.anisotropy;\n\t\t\t\tthis.renderer.scopedTextureCache.roughnessMap_metal.anisotropy = this.anisotropy;\n\t\t\t\tthis.renderer.scopedTextureCache.roughnessMap_stone.anisotropy = this.anisotropy;\n\n\t\t\t\tthis.pmremGenerator = new THREE.PMREMGenerator(this.renderer);\n\t\t\t\tthis.pmremGenerator.compileEquirectangularShader();\n\n\t\t\t\tnew RGBELoader()\n\t\t\t\t\t.setDataType(THREE.HalfFloatType)\n\t\t\t\t\t.setPath('modules/dice-so-nice/textures/equirectangular/')\n\t\t\t\t\t.load('blouberg_sunrise_2_1k.hdr', function (texture) {\n\t\t\t\t\t\tthis.renderer.scopedTextureCache.textureCube = this.pmremGenerator.fromEquirectangular(texture).texture;\n\t\t\t\t\t\tthis.renderer.scopedTextureCache.textureCube.colorSpace = THREE.SRGBColorSpace;\n\t\t\t\t\t\tthis.scene.environment = this.renderer.scopedTextureCache.textureCube;\n\t\t\t\t\t\t//this.scene.background = this.renderer.scopedTextureCache.textureCube;\n\t\t\t\t\t\ttexture.dispose();\n\t\t\t\t\t\tthis.pmremGenerator.dispose();\n\t\t\t\t\t\tresolve();\n\n\t\t\t\t\t}.bind(this));\n\t\t\t} else {\n\t\t\t\tlet loader = new THREE.CubeTextureLoader();\n\t\t\t\tloader.setPath('modules/dice-so-nice/textures/cubemap/');\n\n\t\t\t\tthis.renderer.scopedTextureCache.textureCube = loader.load([\n\t\t\t\t\t'px.webp', 'nx.webp',\n\t\t\t\t\t'py.webp', 'ny.webp',\n\t\t\t\t\t'pz.webp', 'nz.webp'\n\t\t\t\t]);\n\t\t\t\tresolve();\n\t\t\t}\n\t\t});\n\t}\n\n\tsetScene(dimensions) {\n\t\tthis.display.currentWidth = this.container.clientWidth > 0 ? this.container.clientWidth : parseInt(this.container.style.width);\n\t\tthis.display.currentHeight = this.container.clientHeight > 0 ? this.container.clientHeight : parseInt(this.container.style.height);\n\n\t\tthis.display.currentWidth /= 2;\n\t\tthis.display.currentHeight /= 2;\n\n\t\tif (dimensions) {\n\t\t\tthis.display.containerWidth = dimensions.w;\n\t\t\tthis.display.containerHeight = dimensions.h;\n\n\t\t\tif (!this.display.currentWidth || !this.display.currentHeight) {\n\t\t\t\tthis.display.currentWidth = dimensions.w / 2;\n\t\t\t\tthis.display.currentHeight = dimensions.h / 2;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.display.containerWidth = this.display.currentWidth;\n\t\t\tthis.display.containerHeight = this.display.currentHeight;\n\t\t}\n\t\n\t\tthis.display.aspect = Math.min(this.display.currentWidth / this.display.containerWidth, this.display.currentHeight / this.display.containerHeight);\n\n\t\tif (this.config.autoscale)\n\t\t\tthis.display.scale = Math.sqrt(this.display.containerWidth * this.display.containerWidth + this.display.containerHeight * this.display.containerHeight) / 13;\n\t\telse\n\t\t\tthis.display.scale = this.config.scale;\n\t\tif (this.config.boxType == \"board\")\n\t\t\tthis.dicefactory.setScale(this.display.scale);\n\t\tthis.renderer.setSize(this.display.currentWidth * 2, this.display.currentHeight * 2);\n\n\t\tthis.cameraHeight.max = this.display.currentHeight / this.display.aspect / Math.tan(10 * Math.PI / 180);\n\n\t\tthis.cameraHeight.medium = this.cameraHeight.max / 1.5;\n\t\tthis.cameraHeight.far = this.cameraHeight.max;\n\t\tthis.cameraHeight.close = this.cameraHeight.max / 2;\n\n\t\tif (this.camera) this.scene.remove(this.camera);\n\t\tthis.camera = new THREE.PerspectiveCamera(20, this.display.currentWidth / this.display.currentHeight, 1, this.cameraHeight.max * 1.3);\n\n\t\tswitch (this.animstate) {\n\t\t\tcase 'selector':\n\t\t\t\tthis.camera.position.z = this.selector.dice.length > 9 ? this.cameraHeight.far : (this.selector.dice.length < 6 ? this.cameraHeight.close : this.cameraHeight.medium);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthis.camera.position.z = this.cameraHeight.far;\n\t\t}\n\t\tthis.camera.near = 10;\n\t\tthis.camera.lookAt(new THREE.Vector3(0, 0, 0));\n\n\t\tconst maxwidth = Math.max(this.display.containerWidth, this.display.containerHeight);\n\n\t\tif (this.light) this.scene.remove(this.light);\n\t\tif (this.light_amb) this.scene.remove(this.light_amb);\n\n\t\tlet intensity, intensity_amb;\n\t\tif (this.dicefactory.realisticLighting) { //advanced lighting\n\t\t\tintensity = 1.5;\n\t\t\tintensity_amb = 1.0;\n\t\t} else {\n\t\t\tif(this.config.boxType == \"board\") {\n\t\t\t\tintensity = 1.2;\n\t\t\t\tintensity_amb = 1.0;\n\t\t\t} else {\n\t\t\t\tintensity = 1.5;\n\t\t\t\tintensity_amb = 3;\n\t\t\t}\n\t\t}\n\n\t\t\n\t\tthis.light_amb = new THREE.HemisphereLight(this.colors.ambient, this.colors.ground, intensity_amb);\n\t\tthis.scene.add(this.light_amb);\n\n\t\tthis.light = new THREE.DirectionalLight(this.colors.spotlight, intensity);\n\t\tif (this.config.boxType == \"board\")\n\t\t\tthis.light.position.set(-this.display.containerWidth / 10, this.display.containerHeight / 10, maxwidth / 2);\n\t\telse\n\t\t\tthis.light.position.set(0, this.display.containerHeight / 10, maxwidth / 2);\n\t\tthis.light.target.position.set(0, 0, 0);\n\t\tthis.light.distance = 0;\n\t\tthis.light.castShadow = this.dicefactory.shadows;\n\t\tthis.light.shadow.camera.near = maxwidth / 10;\n\t\tthis.light.shadow.camera.far = maxwidth * 5;\n\t\tthis.light.shadow.camera.fov = 50;\n\t\tthis.light.shadow.bias = -0.0001;\n\t\tconst shadowMapSize = this.dicefactory.shadowQuality == \"high\" ? 2048 : 1024;\n\t\tthis.light.shadow.mapSize.width = shadowMapSize;\n\t\tthis.light.shadow.mapSize.height = shadowMapSize;\n\t\tconst d = 1000;\n\t\tthis.light.shadow.camera.left = - d;\n\t\tthis.light.shadow.camera.right = d;\n\t\tthis.light.shadow.camera.top = d;\n\t\tthis.light.shadow.camera.bottom = - d;\n\t\tthis.scene.add(this.light);\n\n\t\tif (this.desk)\n\t\t\tthis.scene.remove(this.desk);\n\n\t\tlet shadowplane = new THREE.ShadowMaterial();\n\t\tshadowplane.opacity = 0.5;\n\t\tthis.desk = new THREE.Mesh(new THREE.PlaneGeometry(this.display.containerWidth * 6, this.display.containerHeight * 6, 1, 1), shadowplane);\n\t\tthis.desk.receiveShadow = this.dicefactory.shadows;\n\t\tthis.desk.position.set(0, 0, -1);\n\t\tthis.scene.add(this.desk);\n\t\tif (this.dicefactory.realisticLighting) {\n\t\t\tlet renderScene = new RenderPass(this.scene, this.camera);\n\t\t\tconst canvasSize = new THREE.Vector2(this.display.currentWidth * 2, this.display.currentHeight * 2);\n\t\t\tthis.bloomPass = new TransparentUnrealBloomPass(canvasSize, game.dice3d.uniforms.bloomStrength.value, game.dice3d.uniforms.bloomRadius.value, game.dice3d.uniforms.bloomThreshold.value);\n\t\t\tthis.gammaPass = new ShaderPass(GammaCorrectionShader);\n\n\t\t\t// Add an outline pass for the outline sfx\n\t\t\tthis.outlinePass = new OutlinePass(canvasSize, this.scene, this.camera);\n\t\t\tthis.outlinePass.pulsePeriod = 1.5;\n\n\t\t\tlet size = canvasSize.multiplyScalar(this.renderer.getPixelRatio());\n\t\t\t//Create a RenderTarget with high precision\n\t\t\tlet options = {\n\t\t\t\ttype: THREE.FloatType,\n\t\t\t\tsamples: this.dicefactory.aa == \"msaa\" ? 4 : 0,\n\t\t\t\tanisotropy: this.anisotropy\n\t\t\t};\n\t\t\t//Workaround for a bug on Chrome on OSX\n\t\t\tif (navigator.userAgent.indexOf('Mac OS X') != -1 && navigator.userAgent.indexOf('Chrome') != -1) {\n\t\t\t\toptions.stencilBuffer = true;\n\t\t\t}\n\t\t\tthis.composerTarget = new THREE.WebGLRenderTarget(size.x, size.y, options);\n\n\t\t\t// This EffectComposer is in charge of rendering the Bloom/Glow effect\n\t\t\tthis.bloomComposer = new EffectComposer(this.renderer, this.composerTarget);\n\t\t\tthis.bloomComposer.renderToScreen = false;\n\t\t\tthis.bloomComposer.addPass(renderScene);\n\t\t\tthis.bloomComposer.addPass(this.bloomPass);\n\n\t\t\t//This shader will blend the bloom effect with the scene. Only the alpha from the bloom effect will be used.\n\t\t\tthis.blendingPass = new ShaderPass(\n\t\t\t\tnew THREE.ShaderMaterial({\n\t\t\t\t\tuniforms: {\n\t\t\t\t\t\tbaseTexture: { value: null },\n\t\t\t\t\t\tbloomTexture: { value: this.bloomComposer.renderTarget2.texture },\n\t\t\t\t\t},\n\t\t\t\t\tvertexShader: `\n\t\t\t\t\t\tvarying vec2 vUv;\n\t\t\t\t\t\tvoid main() {\n\t\t\t\t\t\t\tvUv = uv;\n\t\t\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t\t\t}\n\t\t\t\t\t`,\n\t\t\t\t\tfragmentShader: `\n\t\t\t\t\t\tuniform sampler2D baseTexture;\n\t\t\t\t\t\tuniform sampler2D bloomTexture;\n\t\t\t\t\t\tvarying vec2 vUv;\n\t\t\t\t\t\tvoid main() {\n\t\t\t\t\t\t\tvec4 base = texture2D( baseTexture, vUv );\n\t\t\t\t\t\t\tvec4 bloom = texture2D( bloomTexture, vUv );\n\t\t\t\t\t\t\tgl_FragColor = vec4(base.rgb + ( vec3( 1.0 ) * bloom.rgb ), bloom.a);\n\t\t\t\t\t\t}\n\t\t\t\t\t`,\n\t\t\t\t\tdefines: {}\n\t\t\t\t}), \"baseTexture\"\n\t\t\t);\n\t\t\tthis.blendingPass.needsSwap = true;\n\n\t\t\t// This EffectComposer is in charge of rendering the final image\n\t\t\t// The blendingPass won't be rendered if no emissive textures are found during the render loop\n\t\t\tthis.finalComposer = new EffectComposer(this.renderer, this.composerTarget);\n\t\t\tthis.finalComposer.addPass(renderScene);\n\t\t\tthis.finalComposer.addPass(this.outlinePass);\n\t\t\tthis.finalComposer.addPass(this.blendingPass);\n\n\t\t\t//Software Anti-aliasing pass. Should be rendered in a linear space.\n\t\t\tif (this.dicefactory.aa == \"smaa\") {\n\t\t\t\tthis.AAPass = new SMAAPass(size.x, size.y);\n\t\t\t\tthis.AAPass.renderToScreen = true;\n\t\t\t\tthis.finalComposer.addPass(this.AAPass);\n\t\t\t}\n\n\t\t\t//Gamma correction pass. Convert the image to a gamma space.\n\t\t\tthis.finalComposer.addPass(this.gammaPass);\n\t\t}\n\t\tthis.renderScene();\n\t}\n\n\tasync update(config) {\n\t\tthis.showExtraDice = config.showExtraDice;\n\t\tthis.muteSoundSecretRolls = config.muteSoundSecretRolls;\n\t\tif (this.config.boxType == \"board\") {\n\t\t\tif (config.autoscale) {\n\t\t\t\tthis.display.scale = Math.sqrt(this.display.containerWidth * this.display.containerWidth + this.display.containerHeight * this.display.containerHeight) / 13;\n\t\t\t} else {\n\t\t\t\tthis.display.scale = config.scale\n\t\t\t}\n\t\t\tthis.dicefactory.setScale(this.display.scale);\n\t\t}\n\t\tthis.dicefactory.setQualitySettings(config);\n\n\t\tlet globalAnimationSpeed = game.settings.get(\"dice-so-nice\", \"globalAnimationSpeed\");\n\t\tif (globalAnimationSpeed === \"0\")\n\t\t\tthis.speed = parseInt(config.speed, 10);\n\t\telse\n\t\t\tthis.speed = parseInt(globalAnimationSpeed, 10);\n\n\t\tthis.light.castShadow = this.dicefactory.shadows;\n\t\tthis.desk.receiveShadow = this.dicefactory.shadows;\n\t\tthis.renderer.shadowMap.enabled = this.dicefactory.shadows;\n\t\tthis.renderer.shadowMap.type = this.dicefactory.shadowQuality == \"high\" ? THREE.PCFSoftShadowMap : THREE.PCFShadowMap;\n\t\tthis.sounds = config.sounds;\n\t\tthis.volume = config.soundsVolume;\n\t\tthis.soundsSurface = config.soundsSurface;\n\n\t\tawait this.dicefactory.preloadPresets(true, null, config.appearance);\n\n\t\tthis.throwingForce = config.throwingForce;\n\t\tthis.immersiveDarkness = config.immersiveDarkness;\n\t\tthis.scene.traverse(object => {\n\t\t\tif (object.type === 'Mesh') object.material.needsUpdate = true;\n\t\t});\n\t}\n\n\n\tvectorRand({ x, y }) {\n\t\tlet angle = Math.random() * Math.PI / 5 - Math.PI / 5 / 2;\n\t\tlet vec = {\n\t\t\tx: x * Math.cos(angle) - y * Math.sin(angle),\n\t\t\ty: x * Math.sin(angle) + y * Math.cos(angle)\n\t\t};\n\t\tif (vec.x == 0) vec.x = 0.01;\n\t\tif (vec.y == 0) vec.y = 0.01;\n\t\treturn vec;\n\t}\n\n\t//returns an array of vectordata objects\n\tgetVectors(notationVectors, vector, boost, dist) {\n\n\t\tfor (let i = 0; i < notationVectors.dice.length; i++) {\n\n\t\t\tconst diceobj = this.dicefactory.get(notationVectors.dice[i].type);\n\n\t\t\tlet vec = this.vectorRand(vector);\n\n\t\t\tvec.x /= dist;\n\t\t\tvec.y /= dist;\n\n\t\t\tlet pos = {\n\t\t\t\tx: this.display.containerWidth * (vec.x > 0 ? -1 : 1) * 0.9 + Math.floor(Math.random() * 201) - 100,\n\t\t\t\ty: this.display.containerHeight * (vec.y > 0 ? -1 : 1) * 0.9 + Math.floor(Math.random() * 201) - 100,\n\t\t\t\tz: Math.random() * 200 + 200\n\t\t\t};\n\n\t\t\tlet projector = Math.abs(vec.x / vec.y);\n\t\t\tif (projector > 1.0) pos.y /= projector; else pos.x *= projector;\n\n\n\t\t\tlet velvec = this.vectorRand(vector);\n\n\t\t\tvelvec.x /= dist;\n\t\t\tvelvec.y /= dist;\n\t\t\tlet velocity, angle, axis;\n\n\t\t\tif (diceobj.shape != \"d2\") {\n\n\t\t\t\tvelocity = {\n\t\t\t\t\tx: velvec.x * boost,\n\t\t\t\t\ty: velvec.y * boost,\n\t\t\t\t\tz: -10\n\t\t\t\t};\n\n\t\t\t\tangle = {\n\t\t\t\t\tx: -(Math.random() * vec.y * 5 + diceobj.inertia * vec.y),\n\t\t\t\t\ty: Math.random() * vec.x * 5 + diceobj.inertia * vec.x,\n\t\t\t\t\tz: 0\n\t\t\t\t};\n\n\t\t\t\taxis = {\n\t\t\t\t\tx: Math.random(),\n\t\t\t\t\ty: Math.random(),\n\t\t\t\t\tz: Math.random(),\n\t\t\t\t\ta: Math.random()\n\t\t\t\t};\n\n\t\t\t\taxis = {\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 0,\n\t\t\t\t\tz: 0,\n\t\t\t\t\ta: 0\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\t//coin flip\n\t\t\t\tvelocity = {\n\t\t\t\t\tx: velvec.x * boost / 10,\n\t\t\t\t\ty: velvec.y * boost / 10,\n\t\t\t\t\tz: 3000\n\t\t\t\t};\n\n\t\t\t\tangle = {\n\t\t\t\t\tx: 12 * diceobj.inertia,//-(Math.random() * velvec.y * 50 + diceobj.inertia * velvec.y ) ,\n\t\t\t\t\ty: 1 * diceobj.inertia,//Math.random() * velvec.x * 50 + diceobj.inertia * velvec.x ,\n\t\t\t\t\tz: 0\n\t\t\t\t};\n\n\t\t\t\taxis = {\n\t\t\t\t\tx: 1,//Math.random(), \n\t\t\t\t\ty: 1,//Math.random(), \n\t\t\t\t\tz: Math.random(),\n\t\t\t\t\ta: Math.random()\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tnotationVectors.dice[i].vectors = {\n\t\t\t\ttype: diceobj.type,\n\t\t\t\tpos,\n\t\t\t\tvelocity,\n\t\t\t\tangle,\n\t\t\t\taxis\n\t\t\t};\n\t\t}\n\t\treturn notationVectors;\n\t}\n\n\t// swaps dice faces to match desired result\n\tswapDiceFace(dicemesh) {\n\t\tconst diceobj = this.dicefactory.get(dicemesh.notation.type);\n\n\t\tlet value = parseInt(dicemesh.getLastValue().value);\n\t\tlet result = parseInt(dicemesh.forcedResult);\n\n\t\tif (diceobj.shape == 'd10' && result == 0) result = 10;\n\n\t\tif (diceobj.valueMap) { //die with special values\n\t\t\tresult = diceobj.valueMap[result];\n\t\t}\n\n\t\t// Make the last rolled dice and the DiceBox instance available for debugging\n\t\t//CONFIG.DiceSoNice = {\n\t\t//\tdicemesh,\n\t\t//\tdicebox: this\n\t\t//};\n\n\t\tif (value == result) return;\n\n\t\tlet rotIndex = value > result ? result + \",\" + value : value + \",\" + result;\n\t\t//console.log(`Needed ${result}, Rolled ${value}, Remap: ${rotIndex}`)\n\t\tlet rotationDegrees = DICE_MODELS[dicemesh.shape].rotationCombinations[rotIndex];\n\t\tif (!rotationDegrees) {\n\t\t\tconsole.error(`[Dice So Nice] No dice rotation found for ${dicemesh.shape} ${value} ${result}`);\n\t\t\treturn;\n\t\t}\n\t\tlet eulerAngle = new THREE.Euler(THREE.MathUtils.degToRad(rotationDegrees[0]), THREE.MathUtils.degToRad(rotationDegrees[1]), THREE.MathUtils.degToRad(rotationDegrees[2]));\n\t\tlet quaternion = new THREE.Quaternion().setFromEuler(eulerAngle);\n\t\tif (value > result)\n\t\t\tquaternion.invert();\n\n\t\tdicemesh.applyQuaternion(quaternion);\n\n\t\tdicemesh.resultReason = 'forced';\n\t}\n\n\t/*\n\t// Apply an euler angle from rotationCombinations for debugging\n\t swapTest(dicemesh, mapping, invert = false, revert = true) {\n \n\t\t let rotationDegrees = DICE_MODELS[dicemesh.shape].rotationCombinations[mapping];\n\t\t let eulerAngle = new THREE.Euler(THREE.MathUtils.degToRad(rotationDegrees[0]), THREE.MathUtils.degToRad(rotationDegrees[1]), THREE.MathUtils.degToRad(rotationDegrees[2]));\n\t\t let quaternion = new THREE.Quaternion().setFromEuler(eulerAngle);\n\t\t if (invert)\n\t\t\t quaternion.invert();\n \n\t\t dicemesh.applyQuaternion(quaternion);\n \n\t\t if (revert) {\n\t\t\t setTimeout(() => { this.swapTest(dicemesh, mapping, !invert, false) }, 2000 )\n\t\t }\n \n\t\t dicemesh.resultReason = 'forced';\n\t }\n \n\t// Apply an euler angle directly for debugging\n\t swapTest(dicemesh, mapping, invert = false, revert = true) {\n\t swapTestEuler(dicemesh, euler, invert = false, revert = true) {\n\t\t let eulerAngle = new THREE.Euler(THREE.MathUtils.degToRad(euler[0]), THREE.MathUtils.degToRad(euler[1]), THREE.MathUtils.degToRad(euler[2]));\n\t\t let quaternion = new THREE.Quaternion().setFromEuler(eulerAngle);\n\t\t if (invert)\n\t\t\t quaternion.invert();\n \n\t\t dicemesh.applyQuaternion(quaternion);\n \n\t\t if (revert) {\n\t\t\t setTimeout(() => { this.swapTestEuler(dicemesh, euler, !invert, false) }, 2000 )\n\t\t }\n \n\t\t dicemesh.resultReason = 'forced';\n\t }\n \n\t// Extract the euler angle from a mesh in degrees for debugging\n\t extractEuler(dicemesh) {\n\t\t let euler = dicemesh.rotation\n\t\t console.log(\"World Euler:\", THREE.MathUtils.radToDeg(euler.x), THREE.MathUtils.radToDeg(euler.y), THREE.MathUtils.radToDeg(euler.z), euler.order)\n\t }\n\t*/\n\n\t//spawns one dicemesh object from a single vectordata object\n\tspawnDice(dicedata, appearance) {\n\t\tlet vectordata = dicedata.vectors;\n\t\tconst diceobj = this.dicefactory.get(vectordata.type);\n\t\tif (!diceobj) return;\n\n\t\tlet dicemesh = this.dicefactory.create(this.renderer.scopedTextureCache, diceobj.type, appearance);\n\t\tif (!dicemesh) return;\n\n\t\tlet mass = diceobj.mass;\n\t\tswitch (appearance.material) {\n\t\t\tcase \"metal\":\n\t\t\t\tmass *= 7;\n\t\t\t\tbreak;\n\t\t\tcase \"wood\":\n\t\t\t\tmass *= 0.65;\n\t\t\t\tbreak;\n\t\t\tcase \"glass\":\n\t\t\t\tmass *= 2;\n\t\t\t\tbreak;\n\t\t\tcase \"stone\":\n\t\t\t\tmass *= 1.5;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tdicemesh.notation = vectordata;\n\t\tdicemesh.result = [];\n\t\tdicemesh.forcedResult = dicedata.result;\n\t\tdicemesh.startAtIteration = dicedata.startAtIteration;\n\t\tdicemesh.stopped = 0;\n\t\tdicemesh.castShadow = this.dicefactory.shadows;\n\t\tdicemesh.receiveShadow = this.dicefactory.shadows;\n\t\tdicemesh.specialEffects = dicedata.specialEffects;\n\n\t\tdicemesh.body_sim = new CANNON.Body({ allowSleep: true, sleepSpeedLimit: 75, sleepTimeLimit: 0.9, mass: mass, shape: dicemesh.geometry.cannon_shape, material: this.dice_body_material });\n\t\tdicemesh.body_sim.type = CANNON.Body.DYNAMIC;\n\t\tdicemesh.body_sim.position.set(vectordata.pos.x, vectordata.pos.y, vectordata.pos.z);\n\t\tdicemesh.body_sim.quaternion.setFromAxisAngle(new CANNON.Vec3(vectordata.axis.x, vectordata.axis.y, vectordata.axis.z), vectordata.axis.a * Math.PI * 2);\n\t\tdicemesh.body_sim.angularVelocity.set(vectordata.angle.x, vectordata.angle.y, vectordata.angle.z);\n\t\tdicemesh.body_sim.velocity.set(vectordata.velocity.x, vectordata.velocity.y, vectordata.velocity.z);\n\t\tdicemesh.body_sim.linearDamping = 0.1;\n\t\tdicemesh.body_sim.angularDamping = 0.1;\n\t\tdicemesh.body_sim.addEventListener('collide', this.eventCollide.bind(this));\n\t\tdicemesh.body_sim.stepQuaternions = new Array(1000);\n\t\tdicemesh.body_sim.stepPositions = new Array(1000);\n\n\t\t//We add some informations about the dice to the CANNON body to be used in the collide event\n\t\tdicemesh.body_sim.diceType = diceobj.type;\n\t\tdicemesh.body_sim.diceMaterial = appearance.material;\n\t\tdicemesh.body_sim.secretRoll = dicedata.options?.secret;\n\n\t\tif(dicemesh.userData.glowingInDarkness){\n\t\t\tif(canvas.darknessLevel > 0.5){\n\t\t\t\t//If the darkness level is less than 0.5, we activate the \"glowing in the dark\" mode\n\t\t\t\t//This mode is activated by setting the userData.glowingInDarkness to true on the mesh of the dice\n\t\t\t\tdicemesh.material.emissiveIntensity = 0.3;\n\t\t\t\tdicemesh.material.emissive = new THREE.Color(0xffffff);\n\t\t\t} else {\n\t\t\t\tdicemesh.material.emissiveIntensity = 0;\n\t\t\t\tdicemesh.material.emissive = new THREE.Color(0x000000);\n\t\t\t}\n\t\t}\n\n\t\t//dicemesh.meshCannon = this.body2mesh(dicemesh.body_sim,true);\n\n\t\t/*var gltfExporter = new GLTFExporter();\n\t\tgltfExporter.parse(dicemesh.meshCannon, function ( result ) {\n\t\t\tif ( result instanceof ArrayBuffer ) {\n\t\t\t\tsaveArrayBuffer( result, 'scene.glb' );\n\t\t\t} else {\n\t\t\t\tvar output = JSON.stringify( result, null, 2 );\n\t\t\t\tconsole.log( output );\n\t\t\t\tsaveString( output, 'scene.gltf' );\n\t\t\t}\n\t\t}, {});\n\n\t\tvar link = document.createElement( 'a' );\n\t\tlink.style.display = 'none';\n\t\tdocument.body.appendChild( link ); // Firefox workaround, see #6594\n\n\t\tfunction save( blob, filename ) {\n\t\t\tlink.href = URL.createObjectURL( blob );\n\t\t\tlink.download = filename;\n\t\t\tlink.click();\n\t\t\t// URL.revokeObjectURL( url ); breaks Firefox...\n\t\t}\n\n\t\tfunction saveString( text, filename ) {\n\t\t\tsave( new Blob( [ text ], { type: 'text/plain' } ), filename );\n\t\t}\n\n\t\tfunction saveArrayBuffer( buffer, filename ) {\n\t\t\tsave( new Blob( [ buffer ], { type: 'application/octet-stream' } ), filename );\n\t\t}*/\n\n\t\tlet objectContainer = new THREE.Group();\n\t\tobjectContainer.add(dicemesh);\n\n\t\tthis.diceList.push(dicemesh);\n\t\tif (dicemesh.startAtIteration == 0) {\n\t\t\tthis.scene.add(objectContainer);\n\t\t\t//this.scene.add(dicemesh.meshCannon);\n\t\t\tthis.world_sim.addBody(dicemesh.body_sim);\n\t\t}\n\t}\n\n\teventCollide({ body, target }) {\n\t\t// collision events happen simultaneously for both colliding bodies\n\t\t// all this sanity checking helps limits sounds being played\n\t\tif (!this.sounds || !body || !this.sounds_dice.source) return;\n\n\t\tlet now = body.world.stepnumber;\n\t\tlet currentSoundType = (body.mass > 0) ? 'dice' : 'table';\n\n\t\t// the idea here is that a dice clack should never be skipped in favor of a table sound\n\t\t// if ((don't play sounds if we played one this world step, or there hasn't been enough delay) AND 'this sound IS NOT a dice clack') then 'skip it'\n\t\tif ((this.lastSoundStep == body.world.stepnumber || this.lastSound > body.world.stepnumber) && currentSoundType != 'dice') return;\n\n\t\t// also skip if it's too early and both last sound and this sound are the same\n\t\tif ((this.lastSoundStep == body.world.stepnumber || this.lastSound > body.world.stepnumber) && currentSoundType == 'dice' && this.lastSoundType == 'dice') return;\n\n\t\tif (body.mass > 0) { // dice to dice collision\n\t\t\tlet speed = body.velocity.length();\n\t\t\t// also don't bother playing at low speeds\n\t\t\tif (speed < 250) return;\n\t\t\tlet strength = Math.max(Math.min(speed / (550), 1), 0.2);\n\t\t\tif (this.muteSoundSecretRolls && (body.secretRoll || target.secretRoll))\n\t\t\t\tstrength = 0;\n\t\t\tlet sound;\n\n\t\t\tif (body.diceType != \"dc\") {\n\t\t\t\tlet sounds_dice = this.sounds_dice['plastic'];\n\t\t\t\tif (this.sounds_dice[body.diceMaterial])\n\t\t\t\t\tsounds_dice = this.sounds_dice[body.diceMaterial];\n\t\t\t\tsound = sounds_dice[Math.floor(Math.random() * sounds_dice.length)];\n\t\t\t}\n\t\t\telse\n\t\t\t\tsound = this.sounds_dice['coin'][Math.floor(Math.random() * this.sounds_dice['coin'].length)];\n\t\t\tif (this.animstate == \"simulate\") {\n\t\t\t\tthis.detectedCollides[this.iteration] = [this.sounds_dice.source, sound, strength];\n\t\t\t} else {\n\t\t\t\tthis.playAudioSprite(this.sounds_dice.source, sound, strength);\n\t\t\t}\n\t\t\tthis.lastSoundType = 'dice';\n\n\n\t\t} else { // dice to table collision\n\t\t\tlet speed = target.velocity.length();\n\t\t\t// also don't bother playing at low speeds\n\t\t\tif (speed < 100) return;\n\n\t\t\tlet surface = this.soundsSurface;\n\t\t\tlet strength = Math.max(Math.min(speed / (500), 1), 0.2);\n\t\t\tif (this.muteSoundSecretRolls && (body.secretRoll || target.secretRoll))\n\t\t\t\tstrength = 0;\n\t\t\tlet soundlist = this.sounds_table[surface];\n\t\t\tlet sound = soundlist[Math.floor(Math.random() * soundlist.length)];\n\t\t\tif (this.animstate == \"simulate\") {\n\t\t\t\tthis.detectedCollides[this.iteration] = [this.sounds_table.source, sound, strength];\n\t\t\t} else {\n\t\t\t\tthis.playAudioSprite(this.sounds_table.source, sound, strength);\n\t\t\t}\n\n\t\t\tthis.lastSoundType = 'table';\n\t\t}\n\t\tthis.lastSoundStep = body.world.stepnumber;\n\t\tthis.lastSound = body.world.stepnumber + this.soundDelay;\n\t}\n\n\tthrowFinished(worldType = \"render\") {\n\n\t\tlet stopped = true;\n\t\tif (this.iteration > 1000) return true;\n\t\tif (this.iteration <= this.minIterations) return false;\n\t\tif (worldType == \"render\") {\n\t\t\tstopped = this.iteration >= this.iterationsNeeded;\n\t\t\tif (stopped) {\n\t\t\t\tfor (let i = 0, len = this.diceList.length; i < len; ++i) {\n\t\t\t\t\tthis.diceList[i].body_sim.stepPositions = new Array(1000);\n\t\t\t\t\tthis.diceList[i].body_sim.stepQuaternions = new Array(1000);\n\t\t\t\t\tthis.diceList[i].body_sim.detectedCollides = [];\n\t\t\t\t\tif (!this.diceList[i].body_sim.mass)\n\t\t\t\t\t\tthis.diceList[i].body_sim.dead = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tfor (let i = 0, len = this.diceList.length; i < len; ++i) {\n\t\t\t\tif (this.diceList[i].body_sim.sleepState < 2)\n\t\t\t\t\treturn false;\n\t\t\t\telse if (this.diceList[i].result.length == 0)\n\t\t\t\t\tthis.diceList[i].storeRolledValue();\n\t\t\t}\n\t\t\t//Throw is actually finished\n\t\t\tif (stopped) {\n\t\t\t\tthis.iterationsNeeded = this.iteration;\n\t\t\t\tlet canBeFlipped = game.settings.get(\"dice-so-nice\", \"diceCanBeFlipped\");\n\t\t\t\tif (!canBeFlipped) {\n\t\t\t\t\t//make the current dice on the board STATIC object so they can't be knocked\n\t\t\t\t\tfor (let i = 0, len = this.diceList.length; i < len; ++i) {\n\t\t\t\t\t\tthis.diceList[i].body_sim.mass = 0;\n\t\t\t\t\t\tthis.diceList[i].body_sim.updateMassProperties();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn stopped;\n\t}\n\n\tsimulateThrow() {\n\t\tthis.detectedCollides = new Array(1000);\n\t\tthis.iterationsNeeded = 0;\n\t\tthis.animstate = 'simulate';\n\t\tthis.rolling = true;\n\t\twhile (!this.throwFinished(\"sim\")) {\n\t\t\t//Before each step, we copy the quaternions of every die in an array\n\t\t\t++this.iteration;\n\n\t\t\tif (!(this.iteration % this.nbIterationsBetweenRolls)) {\n\t\t\t\tfor (let i = 0; i < this.diceList.length; i++) {\n\t\t\t\t\tif (this.diceList[i].startAtIteration == this.iteration)\n\t\t\t\t\t\tthis.world_sim.addBody(this.diceList[i].body_sim);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.world_sim.step(this.framerate);\n\n\t\t\tfor (let i = 0; i < this.world_sim.bodies.length; i++) {\n\t\t\t\tif (this.world_sim.bodies[i].stepPositions) {\n\t\t\t\t\tthis.world_sim.bodies[i].stepQuaternions[this.iteration] = {\n\t\t\t\t\t\t\"w\": this.world_sim.bodies[i].quaternion.w,\n\t\t\t\t\t\t\"x\": this.world_sim.bodies[i].quaternion.x,\n\t\t\t\t\t\t\"y\": this.world_sim.bodies[i].quaternion.y,\n\t\t\t\t\t\t\"z\": this.world_sim.bodies[i].quaternion.z\n\t\t\t\t\t};\n\t\t\t\t\tthis.world_sim.bodies[i].stepPositions[this.iteration] = {\n\t\t\t\t\t\t\"x\": this.world_sim.bodies[i].position.x,\n\t\t\t\t\t\t\"y\": this.world_sim.bodies[i].position.y,\n\t\t\t\t\t\t\"z\": this.world_sim.bodies[i].position.z\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t//This is the render loop\n\tanimateThrow() {\n\t\tthis.animstate = 'throw';\n\t\tlet time = (new Date()).getTime();\n\t\tthis.last_time = this.last_time || time - (this.framerate * 1000);\n\t\tlet time_diff = (time - this.last_time) / 1000;\n\n\t\tlet neededSteps = Math.floor(time_diff / this.framerate);\n\n\t\t//Update animated dice mixer\n\t\tif (this.animatedDiceDetected) {\n\t\t\tlet delta = this.clock.getDelta();\n\t\t\tfor (let i in this.scene.children) {\n\t\t\t\tlet container = this.scene.children[i];\n\t\t\t\tlet dicemesh = container.children && container.children.length && container.children[0].body_sim != undefined ? container.children[0] : null;\n\t\t\t\tif (dicemesh && dicemesh.mixer) {\n\t\t\t\t\tdicemesh.mixer.update(delta);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (neededSteps && this.rolling) {\n\t\t\tfor (let i = 0; i < neededSteps * this.speed; i++) {\n\t\t\t\t++this.iteration;\n\t\t\t\tif (!(this.iteration % this.nbIterationsBetweenRolls)) {\n\t\t\t\t\tfor (let i = 0; i < this.diceList.length; i++) {\n\t\t\t\t\t\tif (this.diceList[i].startAtIteration == this.iteration) {\n\t\t\t\t\t\t\tthis.scene.add(this.diceList[i].parent);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.iteration > this.iterationsNeeded)\n\t\t\t\tthis.iteration = this.iterationsNeeded;\n\n\t\t\t// update physics interactions visually\n\n\t\t\tfor (let i in this.scene.children) {\n\t\t\t\tlet container = this.scene.children[i];\n\t\t\t\tlet dicemesh = container.children && container.children.length && container.children[0].body_sim != undefined && !container.children[0].body_sim.dead ? container.children[0] : null;\n\t\t\t\tif (dicemesh && dicemesh.body_sim.stepPositions[this.iteration]) {\n\t\t\t\t\tcontainer.position.copy(dicemesh.body_sim.stepPositions[this.iteration]);\n\t\t\t\t\tcontainer.quaternion.copy(dicemesh.body_sim.stepQuaternions[this.iteration]);\n\n\t\t\t\t\tif (dicemesh.meshCannon) {\n\t\t\t\t\t\tdicemesh.meshCannon.position.copy(dicemesh.body_sim.stepPositions[this.iteration]);\n\t\t\t\t\t\tdicemesh.meshCannon.quaternion.copy(dicemesh.body_sim.stepQuaternions[this.iteration]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.detectedCollides[this.iteration]) {\n\t\t\t\tthis.playAudioSprite(...this.detectedCollides[this.iteration]);\n\t\t\t}\n\t\t} else if (!this.rolling) {\n\t\t\tlet worldAsleep = true;\n\t\t\tfor (let i = 0; i < this.world_sim.bodies.length; i++) {\n\t\t\t\tif (this.world_sim.bodies[i].allowSleep && this.world_sim.bodies[i].sleepState < 2) {\n\t\t\t\t\tworldAsleep = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!worldAsleep) {\n\t\t\t\tthis.world_sim.step(this.framerate, time_diff);\n\t\t\t\tfor (let i in this.scene.children) {\n\t\t\t\t\tlet container = this.scene.children[i];\n\t\t\t\t\tlet dicemesh = container.children && container.children.length && container.children[0].body_sim != undefined && !container.children[0].body_sim.dead ? container.children[0] : null;\n\t\t\t\t\tif (dicemesh) {\n\t\t\t\t\t\tcontainer.position.copy(dicemesh.body_sim.position);\n\t\t\t\t\t\tcontainer.quaternion.copy(dicemesh.body_sim.quaternion);\n\n\t\t\t\t\t\tif (dicemesh.meshCannon) {\n\t\t\t\t\t\t\tdicemesh.meshCannon.position.copy(dicemesh.body_sim.position);\n\t\t\t\t\t\t\tdicemesh.meshCannon.quaternion.copy(dicemesh.body_sim.quaternion);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.isVisible && (this.allowInteractivity || this.animatedDiceDetected || neededSteps || DiceSFXManager.renderQueue.length)) {\n\t\t\tDiceSFXManager.renderSFX();\n\t\t\t//use darknessLevel to change toneMapping\n\t\t\tif (this.dicefactory.realisticLighting && this.immersiveDarkness) {\n\t\t\t\t//If the darkness level is not defined, we set it to 0\n\t\t\t\tlet darknessLevel = canvas.darknessLevel || 0;\n\t\t\t\tthis.renderer.toneMappingExposure = this.toneMappingExposureDefault * 0.4 + (this.toneMappingExposureDefault * 0.6 - darknessLevel * 0.6);\n\t\t\t}\n\t\t\tthis.renderScene();\n\t\t}\n\t\tif (this.rendererStats)\n\t\t\tthis.rendererStats.update(this.renderer);\n\t\tthis.last_time = this.last_time + neededSteps * this.framerate * 1000;\n\n\t\t// roll finished\n\t\tif (this.throwFinished(\"render\")) {\n\t\t\t//if animated dice still on the table, keep animating\n\t\t\tthis.rolling = false;\n\t\t\tif (this.running) {\n\t\t\t\tthis.handleSpecialEffectsInit().then(() => {\n\t\t\t\t\tthis.callback(this.throws);\n\t\t\t\t\tthis.callback = null;\n\t\t\t\t\tthis.throws = null;\n\t\t\t\t\tif (!this.animatedDiceDetected && !(this.allowInteractivity && (this.deadDiceList.length + this.diceList.length) > 0) && !DiceSFXManager.renderQueue.length)\n\t\t\t\t\t\tthis.removeTicker(this.animateThrow);\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.running = false;\n\t\t}\n\t}\n\n\tstart_throw(throws, callback) {\n\t\tif (this.rolling) return;\n\t\tlet countNewDice = 0;\n\t\tthrows.forEach(notation => {\n\t\t\tlet vector = { x: (Math.random() * 2 - 0.5) * this.display.currentWidth, y: -(Math.random() * 2 - 0.5) * this.display.currentHeight };\n\t\t\tlet dist = Math.sqrt(vector.x * vector.x + vector.y * vector.y);\n\t\t\tlet throwingForceModifier = 0.8;\n\t\t\tswitch (this.throwingForce) {\n\t\t\t\tcase \"weak\":\n\t\t\t\t\tthrowingForceModifier = 0.5;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"strong\":\n\t\t\t\t\tthrowingForceModifier = 1.8;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tlet boost = ((Math.random() + 3) * throwingForceModifier) * dist;\n\n\t\t\tnotation = this.getVectors(notation, vector, boost, dist);\n\t\t\tcountNewDice += notation.dice.length;\n\t\t});\n\n\t\tlet maxDiceNumber = game.settings.get(\"dice-so-nice\", \"maxDiceNumber\");\n\t\tif (this.deadDiceList.length + this.diceList.length + countNewDice > maxDiceNumber) {\n\t\t\tthis.clearAll();\n\t\t}\n\t\tthis.isVisible = true;\n\t\tthis.rollDice(throws, callback);\n\t}\n\n\tclearDice() {\n\t\tthis.running = false;\n\t\tthis.deadDiceList = this.deadDiceList.concat(this.diceList);\n\t\tthis.diceList = [];\n\t}\n\n\tclearAll() {\n\t\tthis.clearDice();\n\t\tlet dice;\n\t\twhile (dice = this.deadDiceList.pop()) {\n\t\t\tthis.scene.remove(dice.parent.type == \"Scene\" ? dice : dice.parent);\n\t\t\tif (dice.body_sim) this.world_sim.remove(dice.body_sim);\n\t\t}\n\n\t\tif (this.pane) this.scene.remove(this.pane);\n\n\t\tif (this.config.boxType == \"board\") {\n\t\t\tDiceSFXManager.clearQueue();\n\t\t\tthis.removeTicker(this.animateThrow);\n\t\t} else {\n\t\t\tthis.removeTicker(this.animateSelector);\n\t\t}\n\n\t\tthis.renderScene();\n\n\t\tthis.isVisible = false;\n\t}\n\n\trenderScene() {\n\t\tif (this.dicefactory.realisticLighting) {\n\t\t\tgame.dice3d.uniforms.globalBloom.value = 1;\n\t\t\tif (!this.finalComposer)\n\t\t\t\treturn;\n\n\t\t\t//Check if there is any emissive materials before rendering the bloom pass\n\t\t\tlet hasEmissive = false;\n\t\t\tlet black = this.blackColor;\n\t\t\tthis.scene.traverseVisible(function (object) {\n\t\t\t\tif (object.material && object.material.emissive != undefined && !object.material.emissive.equals(black)) {\n\t\t\t\t\thasEmissive = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (hasEmissive && this.dicefactory.glow) {\n\t\t\t\tthis.bloomComposer.render();\n\t\t\t\tthis.blendingPass.enabled = true;\n\t\t\t} else {\n\t\t\t\tthis.blendingPass.enabled = false;\n\t\t\t}\n\t\t\tgame.dice3d.uniforms.globalBloom.value = 0;\n\t\t\tthis.finalComposer.render();\n\t\t} else {\n\t\t\tthis.renderer.render(this.scene, this.camera);\n\t\t}\n\t}\n\n\tclearScene() {\n\t\twhile (this.scene.children.length > 0) {\n\t\t\tthis.scene.remove(this.scene.children[0]);\n\t\t}\n\t\tthis.desk.material.dispose();\n\t\tthis.desk.geometry.dispose();\n\t\tif(this.composerTarget)\n\t\t\tthis.composerTarget.dispose();\n\t\tif(this.bloomPass)\n\t\t\tthis.bloomPass.dispose();\n\t\tif(this.AAPass)\n\t\t\tthis.AAPass.dispose();\n\t\tif(this.bloomComposer){\n\t\t\tthis.bloomComposer.renderTarget1.dispose();\n\t\t\tthis.bloomComposer.renderTarget2.dispose();\n\t\t}\n\t\tif(this.finalComposer){\n\t\t\tthis.finalComposer.renderTarget1.dispose();\n\t\t\tthis.finalComposer.renderTarget2.dispose();\n\t\t}\n\t\tif (this.dicefactory.shadows) {\n\t\t\tthis.light.shadow.map.dispose();\n\t\t}\n\t\tif (this.config.boxType == \"board\")\n\t\t\tthis.removeTicker(this.animateThrow);\n\t\telse\n\t\t\tthis.removeTicker(this.animateSelector);\n\t}\n\n\t//Allow to remove an handler from a PIXI ticker even when the context changed.\n\tremoveTicker(fn) {\n\t\tlet ticker = canvas.app.ticker;\n\t\tlet listener = ticker._head.next;\n\n\t\twhile (listener) {\n\t\t\t// We found a match, lets remove it\n\t\t\t// no break to delete all possible matches\n\t\t\t// incase a listener was added 2+ times\n\t\t\tif (listener.fn === fn) {\n\t\t\t\tlistener = listener.destroy();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlistener = listener.next;\n\t\t\t}\n\t\t}\n\n\t\tif (!ticker._head.next) {\n\t\t\tticker._cancelIfNeeded();\n\t\t}\n\t\treturn ticker;\n\t}\n\n\trollDice(throws, callback) {\n\n\t\tthis.camera.position.z = this.cameraHeight.far;\n\t\tthis.clearDice();\n\t\tthis.minIterations = (throws.length - 1) * this.nbIterationsBetweenRolls;\n\n\t\tfor (let j = 0; j < throws.length; j++) {\n\t\t\tlet notationVectors = throws[j];\n\n\t\t\tfor (let i = 0, len = notationVectors.dice.length; i < len; ++i) {\n\t\t\t\tnotationVectors.dice[i].startAtIteration = j * this.nbIterationsBetweenRolls;\n\t\t\t\tlet appearance = this.dicefactory.getAppearanceForDice(notationVectors.dsnConfig.appearance, notationVectors.dice[i].type, notationVectors.dice[i]);\n\t\t\t\tthis.spawnDice(notationVectors.dice[i], appearance);\n\t\t\t}\n\t\t}\n\t\tthis.iteration = 0;\n\n\t\tthis.simulateThrow();\n\t\tthis.iteration = 0;\n\n\n\t\t//check forced results, fix dice faces if necessary\n\t\t//Detect if there's an animated dice\n\t\tthis.animatedDiceDetected = false;\n\t\tfor (let i = 0, len = this.diceList.length; i < len; ++i) {\n\t\t\tlet dicemesh = this.diceList[i];\n\t\t\tif (!dicemesh) continue;\n\t\t\tthis.swapDiceFace(dicemesh);\n\t\t\tif (dicemesh.mixer)\n\t\t\t\tthis.animatedDiceDetected = true;\n\t\t}\n\n\t\t//reset the result\n\t\tfor (let i = 0, len = this.diceList.length; i < len; ++i) {\n\t\t\tif (!this.diceList[i]) continue;\n\n\t\t\tif (this.diceList[i].resultReason != 'forced') {\n\t\t\t\tthis.diceList[i].result = [];\n\t\t\t}\n\t\t}\n\n\t\t// animate the previously simulated roll\n\t\tthis.rolling = true;\n\t\tthis.running = (new Date()).getTime();\n\t\tthis.last_time = 0;\n\t\tthis.callback = callback;\n\t\tthis.throws = throws;\n\t\tthis.removeTicker(this.animateThrow);\n\t\tcanvas.app.ticker.add(this.animateThrow, this);\n\t}\n\n\tshowcase(config) {\n\t\tthis.clearAll();\n\n\t\tlet selectordice = this.dicefactory.systems.standard.dice.map(dice => dice.type);\n\t\tconst extraDiceTypes = [\"d3\", \"d5\", \"d7\", \"d14\", \"d16\", \"d24\", \"d30\"];\n\t\tif (!this.showExtraDice)\n\t\t\tselectordice = selectordice.filter((die) => !extraDiceTypes.includes(die));\n\n\t\tlet proportion = this.display.containerWidth / this.display.containerHeight;\n\t\tlet columns = Math.min(selectordice.length, Math.round(Math.sqrt(proportion * selectordice.length)));\n\t\tlet rows = Math.floor((selectordice.length + columns - 1) / columns);\n\n\t\tthis.camera.position.z = this.cameraHeight.medium;\n\t\tthis.camera.position.x = this.display.containerWidth / 2 - (this.display.containerWidth / columns / 2);\n\t\tthis.camera.position.y = -this.display.containerHeight / 2 + (this.display.containerHeight / rows / 2);\n\t\tthis.camera.fov = 2 * Math.atan(this.display.containerHeight / (2 * this.camera.position.z)) * (180 / Math.PI);\n\t\tthis.camera.updateProjectionMatrix();\n\n\t\tif (this.pane) this.scene.remove(this.pane);\n\t\tif (this.desk) this.scene.remove(this.desk);\n\t\tif (this.dicefactory.shadows) {\n\n\t\t\tlet shadowplane = new THREE.ShadowMaterial();\n\t\t\tshadowplane.opacity = 0.5;\n\n\t\t\tthis.pane = new THREE.Mesh(new THREE.PlaneGeometry(this.display.containerWidth * 2, this.display.containerHeight * 2, 1, 1), shadowplane);\n\t\t\tthis.pane.receiveShadow = this.dicefactory.shadows;\n\t\t\tthis.pane.position.set(0, 0, -70);\n\t\t\tthis.scene.add(this.pane);\n\t\t}\n\n\t\tlet z = 0;\n\t\tlet count = 0;\n\t\tfor (let y = 0; y < rows; y++) {\n\t\t\tfor (let x = 0; x < columns; x++) {\n\t\t\t\tif (count >= selectordice.length)\n\t\t\t\t\tbreak;\n\t\t\t\tlet appearance = this.dicefactory.getAppearanceForDice(config.appearance, selectordice[count]);\n\t\t\t\tlet dicemesh = this.dicefactory.create(this.renderer.scopedTextureCache, selectordice[count], appearance);\n\t\t\t\tdicemesh.scale.set(\n\t\t\t\t\tMath.min(dicemesh.scale.x * 5 / columns, dicemesh.scale.x * 2 / rows),\n\t\t\t\t\tMath.min(dicemesh.scale.y * 5 / columns, dicemesh.scale.y * 2 / rows),\n\t\t\t\t\tMath.min(dicemesh.scale.z * 5 / columns, dicemesh.scale.z * 2 / rows)\n\t\t\t\t);\n\n\t\t\t\tdicemesh.position.set(x * this.display.containerWidth / columns, -(y * this.display.containerHeight / rows), z);\n\n\t\t\t\tdicemesh.castShadow = this.dicefactory.shadows;\n\n\t\t\t\tdicemesh.userData = selectordice[count];\n\n\t\t\t\tthis.diceList.push(dicemesh);\n\t\t\t\tthis.scene.add(dicemesh);\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\n\t\tthis.last_time = 0;\n\t\tif (this.selector.animate) {\n\t\t\tthis.container.style.opacity = 0;\n\t\t\tthis.last_time = window.performance.now();\n\t\t\tthis.start_time = this.last_time;\n\t\t\tthis.framerate = 1000 / 60;\n\t\t\tthis.removeTicker(this.animateSelector);\n\t\t\tcanvas.app.ticker.add(this.animateSelector, this);\n\t\t}\n\t\telse this.renderScene();\n\t\tsetTimeout(() => {\n\t\t\tthis.scene.traverse(object => {\n\t\t\t\tif (object.type === 'Mesh') object.material.needsUpdate = true;\n\t\t\t});\n\t\t}, 2000);\n\t}\n\n\tanimateSelector() {\n\t\tthis.animstate = 'selector';\n\t\tlet now = window.performance.now();\n\t\tlet elapsed = now - this.last_time;\n\t\tif (elapsed > this.framerate) {\n\t\t\tthis.last_time = now - (elapsed % this.framerate);\n\n\t\t\tif (this.container.style.opacity != '1') this.container.style.opacity = Math.min(1, (parseFloat(this.container.style.opacity) + 0.05));\n\n\t\t\tif (this.selector.rotate) {\n\t\t\t\tlet angle_change = 0.005 * Math.PI;\n\t\t\t\tfor (let i = 0; i < this.diceList.length; i++) {\n\t\t\t\t\tthis.diceList[i].rotation.y += angle_change;\n\t\t\t\t\tthis.diceList[i].rotation.x += angle_change / 4;\n\t\t\t\t\tthis.diceList[i].rotation.z += angle_change / 10;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.renderScene();\n\t\t}\n\t}\n\n\t//used to debug cannon shape vs three shape\n\tbody2mesh(body) {\n\t\tvar obj = new THREE.Object3D();\n\t\tlet currentMaterial = new THREE.MeshBasicMaterial({ wireframe: true });\n\t\tfor (var l = 0; l < body.shapes.length; l++) {\n\t\t\tvar shape = body.shapes[l];\n\n\t\t\tvar mesh;\n\n\t\t\tswitch (shape.type) {\n\n\t\t\t\tcase CANNON.Shape.types.SPHERE:\n\t\t\t\t\tvar sphere_geometry = new THREE.SphereGeometry(shape.radius, 8, 8);\n\t\t\t\t\tmesh = new THREE.Mesh(sphere_geometry, currentMaterial);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CANNON.Shape.types.PARTICLE:\n\t\t\t\t\tmesh = new THREE.Mesh(this.particleGeo, this.particleMaterial);\n\t\t\t\t\tvar s = this.settings;\n\t\t\t\t\tmesh.scale.set(s.particleSize, s.particleSize, s.particleSize);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CANNON.Shape.types.PLANE:\n\t\t\t\t\tvar geometry = new THREE.PlaneGeometry(10, 10, 4, 4);\n\t\t\t\t\tmesh = new THREE.Object3D();\n\t\t\t\t\tvar submesh = new THREE.Object3D();\n\t\t\t\t\tvar ground = new THREE.Mesh(geometry, currentMaterial);\n\t\t\t\t\tground.scale.set(100, 100, 100);\n\t\t\t\t\tsubmesh.add(ground);\n\n\t\t\t\t\tground.castShadow = true;\n\t\t\t\t\tground.receiveShadow = true;\n\n\t\t\t\t\tmesh.add(submesh);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CANNON.Shape.types.BOX:\n\t\t\t\t\tvar box_geometry = new THREE.BoxGeometry(shape.halfExtents.x * 2,\n\t\t\t\t\t\tshape.halfExtents.y * 2,\n\t\t\t\t\t\tshape.halfExtents.z * 2);\n\t\t\t\t\tmesh = new THREE.Mesh(box_geometry, currentMaterial);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CANNON.Shape.types.CONVEXPOLYHEDRON:\n\t\t\t\t\tvar geo = new THREE.BufferGeometry()\n\t\t\t\t\tvar points = []\n\t\t\t\t\tfor (var i = 0; i < shape.faces.length; i++) {\n\t\t\t\t\t\tvar face = shape.faces[i];\n\n\t\t\t\t\t\tfor (var j = 0; j < face.length - 1; j++) {\n\t\t\t\t\t\t\tvar a = shape.vertices[face[j]];\n\t\t\t\t\t\t\tvar b = shape.vertices[face[j + 1]];\n\t\t\t\t\t\t\tpoints.push(a);\n\t\t\t\t\t\t\tpoints.push(b);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tgeo.setFromPoints(points);\n\t\t\t\t\tgeo.computeVertexNormals();\n\t\t\t\t\tmesh = new THREE.Mesh(geo, currentMaterial);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow \"Visual type not recognized: \" + shape.type;\n\t\t\t}\n\n\t\t\t//mesh.receiveShadow = this.dicefactory.shadows;\n\t\t\tmesh.castShadow = this.dicefactory.shadows;\n\t\t\tif (mesh.children) {\n\t\t\t\tfor (var i = 0; i < mesh.children.length; i++) {\n\t\t\t\t\tmesh.children[i].castShadow = true;\n\t\t\t\t\tmesh.children[i].receiveShadow = true;\n\t\t\t\t\tif (mesh.children[i]) {\n\t\t\t\t\t\tfor (var j = 0; j < mesh.children[i].length; j++) {\n\t\t\t\t\t\t\tmesh.children[i].children[j].castShadow = true;\n\t\t\t\t\t\t\tmesh.children[i].children[j].receiveShadow = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar o = body.shapeOffsets[l];\n\t\t\tvar q = body.shapeOrientations[l];\n\t\t\tmesh.position.set(o.x, o.y, o.z);\n\t\t\tmesh.quaternion.set(q.x, q.y, q.z, q.w);\n\n\t\t\tobj.add(mesh);\n\t\t}\n\n\t\treturn obj;\n\t}\n\n\tfindRootObject(object) {\n\t\tif (object.hasOwnProperty(\"shape\"))\n\t\t\treturn object;\n\t\telse if (object.parent)\n\t\t\treturn this.findRootObject(object.parent);\n\t\telse\n\t\t\treturn null;\n\t}\n\n\tfindShowcaseDie(pos) {\n\t\tthis.raycaster.setFromCamera(pos, this.camera);\n\t\tconst intersects = this.raycaster.intersectObjects([...this.diceList, ...this.deadDiceList], true);\n\t\tif (intersects.length) {\n\n\t\t\treturn intersects[0];\n\t\t}\n\t\telse\n\t\t\treturn null;\n\t}\n\n\tfindHoveredDie() {\n\t\tif (this.isVisible && !this.running && !this.mouse.constraintDown) {\n\t\t\tthis.raycaster.setFromCamera(this.mouse.pos, this.camera);\n\t\t\tconst intersects = this.raycaster.intersectObjects([...this.diceList, ...this.deadDiceList], true);\n\t\t\tif (intersects.length) {\n\t\t\t\tthis.hoveredDie = intersects[0];\n\t\t\t}\n\t\t\telse\n\t\t\t\tthis.hoveredDie = null;\n\t\t}\n\t}\n\n\tonMouseMove(event, ndc) {\n\t\tthis.mouse.pos.x = ndc.x;\n\t\tthis.mouse.pos.y = ndc.y;\n\n\t\tif (this.mouse.constraint) {\n\t\t\tthis.raycaster.setFromCamera(this.mouse.pos, this.camera);\n\t\t\tconst intersects = this.raycaster.intersectObjects([this.desk]);\n\t\t\tif (intersects.length) {\n\t\t\t\tlet pos = intersects[0].point;\n\t\t\t\tthis.jointBody.position.set(pos.x, pos.y, pos.z + 150);\n\t\t\t\tthis.mouse.constraint.update();\n\t\t\t}\n\t\t}\n\t}\n\n\tonMouseDown(event, ndc) {\n\t\tthis.mouse.pos.x = ndc.x;\n\t\tthis.mouse.pos.y = ndc.y;\n\t\tthis.hoveredDie = null;\n\t\tthis.findHoveredDie();\n\n\t\tlet entity = this.hoveredDie;\n\t\tif (!entity)\n\t\t\treturn;\n\t\tlet pos = entity.point;\n\t\tif (pos) {\n\t\t\tthis.mouse.constraintDown = true;\n\t\t\t//disable FVTT mouse events\n\t\t\tevent.stopPropagation();\n\t\t\tevent.preventDefault();\n\t\t\tif (canvas.mouseInteractionManager)\n\t\t\t\tcanvas.mouseInteractionManager.object.interactive = false;\n\n\t\t\t// Vector to the clicked point, relative to the body\n\t\t\tlet root = this.findRootObject(entity.object);\n\t\t\tlet v1 = new CANNON.Vec3(pos.x, pos.y, pos.z).vsub(root.body_sim.position);\n\n\t\t\t// Apply anti-quaternion to vector to tranform it into the local body coordinate system\n\t\t\tlet antiRot = root.body_sim.quaternion.inverse();\n\t\t\tlet pivot = antiRot.vmult(v1); // pivot is not in local body coordinates\n\n\t\t\t// Move the cannon click marker particle to the click position\n\t\t\tthis.jointBody.position.set(pos.x, pos.y, pos.z + 150);\n\n\t\t\t// Create a new constraint\n\t\t\t// The pivot for the jointBody is zero\n\t\t\tthis.mouse.constraint = new CANNON.PointToPointConstraint(root.body_sim, pivot, this.jointBody, new CANNON.Vec3(0, 0, 0));\n\n\t\t\t// Add the constriant to world\n\t\t\tthis.world_sim.addConstraint(this.mouse.constraint);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tonMouseUp(event) {\n\t\tif (this.mouse.constraintDown) {\n\t\t\tthis.mouse.constraintDown = false;\n\t\t\tthis.world_sim.removeConstraint(this.mouse.constraint);\n\n\t\t\t//re-enable fvtt canvas events\n\t\t\tif (canvas.mouseInteractionManager)\n\t\t\t\tcanvas.mouseInteractionManager.activate();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tasync handleSpecialEffectsInit() {\n\t\tlet promisesSFX = [];\n\t\tthis.diceList.forEach(dice => {\n\t\t\tif (dice.specialEffects) {\n\t\t\t\tdice.specialEffects.forEach(sfx => {\n\t\t\t\t\tpromisesSFX.push(DiceSFXManager.playSFX(sfx, this, dice));\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\treturn Promise.all(promisesSFX);\n\t}\n}\n","\"use strict\"\n\nexport class DiceNotation {\n\n\t/**\n\t * A roll object from Foundry \n\t * @param {Roll} rolls \n\t */\n\tconstructor(rolls, userConfig = null) {\n\t\tthis.throws = [{dice:[]}];\n\t\tthis.userConfig = userConfig;\n\t\t\n\t\t//First we need to prepare the data\n\t\trolls.dice.forEach(die => {\n\t\t\t//We only are able to handle this list of number of face in 3D for now\n\t\t\tif([2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 30, 100].includes(die.faces)) {\n\t\t\t\t//We flag every single die with a throw number, to queue exploded dice\n\t\t\t\tlet cnt=die.number;\n\t\t\t\tlet countExploded = 0;\n\t\t\t\tlet localNbThrow = 0;\n\t\t\t\tfor(let i =0; i< die.results.length; i++){\n\t\t\t\t\tif(localNbThrow >= this.throws.length)\n\t\t\t\t\t\tthis.throws.push({dice:[]});\n\n\t\t\t\t\tif(die.results[i].exploded)\n\t\t\t\t\t\tcountExploded++;\n\t\t\t\t\tdie.results[i].indexThrow = localNbThrow;\n\t\t\t\t\tif (die.results[i].discarded) continue; //Continue if die result is discarded\n\t\t\t\t\t//If we have a new throw\n\t\t\t\t\tif(--cnt <= 0){\n\t\t\t\t\t\tlocalNbThrow++;\n\t\t\t\t\t\tcnt = countExploded;\n\t\t\t\t\t\tcountExploded = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tlet diceNumber = 0;\n\t\tlet maxDiceNumber = game.settings.get(\"dice-so-nice\", \"maxDiceNumber\");\n\t\t//Then we can create the throws\n\t\trolls.dice.some(die => {\n\t\t\t//We only are able to handle this list of number of face in 3D for now\n\t\t\tif([2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 30, 100].includes(die.faces)) {\n\t\t\t\tlet options = {};\n\t\t\t\tfor(let i =0; i< die.results.length; i++){\n\t\t\t\t\tif(++diceNumber >= maxDiceNumber)\n\t\t\t\t\t\treturn true;\n\t\t\t\t\tif(!die.results[i].hidden){\n\t\t\t\t\t\t//ghost can't be secret\n\t\t\t\t\t\tif(rolls.ghost)\n\t\t\t\t\t\t\toptions.ghost = true;\n\t\t\t\t\t\telse if(rolls.secret)\n\t\t\t\t\t\t\toptions.secret = true;\n\n\t\t\t\t\t\tif(die.modifiers.length)\n\t\t\t\t\t\t\toptions.modifiers = die.modifiers;\n\n\t\t\t\t\t\tthis.addDie({fvttDie: die, index:i, options:options});\n\t\t\t\t\t\tif(die.faces == 100){\n\t\t\t\t\t\t\tthis.addDie({fvttDie: die, index:i, isd10of100:true, options:options});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t/**\n\t * \n\t * @param {DiceTerm} fvttDie Die object from Foundry VTT\n\t * @param {Integer} index Position in the dice array\n\t * @param {Boolean} isd10of100 In DsN, we use two d10 for a d100. Set to true if this die should be the unit dice of a d100\n\t * @param {Object} options Options related to the fvtt roll that should be attached to the dsn die\n\t */\n\taddDie({fvttDie, index, isd10of100 = false, options = {}}){\n\t\tlet dsnDie = {};\n\t\tlet dieValue = fvttDie.results[index].result;\n\t\tif(fvttDie.faces == 100) {\n\t\t\t//For d100, we create two d10 dice\n\t\t\tif(isd10of100) {\n\t\t\t\tdieValue = dieValue%10;\n\t\t\t\t\n\t\t\t\tdsnDie.resultLabel = fvttDie.getResultLabel({result:dieValue});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdieValue = parseInt(dieValue/10);\n\t\t\t\tdsnDie.resultLabel = fvttDie.getResultLabel({result:dieValue*10});\n\t\t\t\t//On a d100, 0 is 10, because.\n\t\t\t\tif(dieValue==10)\n\t\t\t\t\tdieValue=0;\n\t\t\t}\n\t\t\tdsnDie.d100Result = fvttDie.results[index].result;\n\t\t} else\n\t\t\t\n\t\t\tdsnDie.resultLabel = fvttDie.getResultLabel({result:dieValue});\n\t\tdsnDie.result = dieValue;\n\t\tif(fvttDie.results[index].discarded)\n\t\t\tdsnDie.discarded = true;\n\n\n\t\t//If it is not a standard die (\"d\"), we need to prepend \"d\" to the denominator. If it is, we append the number of face\n\t\tdsnDie.type = fvttDie.constructor.DENOMINATION;\n\t\tif(fvttDie.constructor.name == CONFIG.Dice.terms[\"d\"].name)\n\t\t\tdsnDie.type += isd10of100 ? \"10\":fvttDie.faces;\n\t\telse {\n\t\t\tdsnDie.type = \"d\"+dsnDie.type;\n\t\t}\n\t\tdsnDie.vectors = [];\n\t\t//Contains optionals flavor (core) and colorset (dsn) infos.\n\t\tdsnDie.options = foundry.utils.duplicate(fvttDie.options);\n\t\tfoundry.utils.mergeObject(dsnDie.options, options);\n\t\tif(this.userConfig && !this.userConfig.enableFlavorColorset && dsnDie.options.flavor)\n\t\t\tdelete dsnDie.options.flavor;\n\n\t\tthis.throws[fvttDie.results[index].indexThrow].dice.push(dsnDie);\n\t}\n\n\tstatic mergeQueuedRollCommands(queue){\n\t\tlet mergedRollCommands = [];\n\t\tqueue.forEach(command => {\n\t\t\tfor(let i = 0; i< command.params.throws.length; i++){\n\t\t\t\tif(!mergedRollCommands[i])\n\t\t\t\t\tmergedRollCommands.push([]);\n\t\t\t\tcommand.params.throws[i].dsnConfig = command.params.dsnConfig;\n\t\t\t\tmergedRollCommands[i].push(command.params.throws[i]);\n\t\t\t}\n\t\t});\n\t\t//First we loop on the command list\n\t\tfor(let i=0;i<mergedRollCommands.length;i++){\n\t\t\t//Then we loop on throws\n\t\t\tfor(let j=0;j<mergedRollCommands[i].length;j++){\n\n\t\t\t\t//Retrieve the sfx list (unfiltered) for this throw. We do not know yet if these sfx should be visible or not\n\t\t\t\tlet sfxList = mergedRollCommands[i][j].dsnConfig.specialEffects;\n\t\t\t\t/*if(!sfxList || !sfxList[\"0\"])\n\t\t\t\t\tcontinue;*/\n\t\t\t\t//Finally we loop over each dice in this throw\n\t\t\t\tfor(let k=0;k<mergedRollCommands[i][j].dice.length;k++){\n\t\t\t\t\tconst dsnDie = mergedRollCommands[i][j].dice[k];\n\t\t\t\t\t//attach SFX that should trigger for this roll\n\t\t\t\t\t//For each sfx configured\n\t\t\t\t\tlet specialEffects = Object.values(sfxList).filter(sfx => {\n\t\t\t\t\t\t//if the dice is discarded, it should not trigger a special fx\n\t\t\t\t\t\tif(dsnDie.discarded)\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\n\t\t\t\t\t\t//if the dice is a ghost dice, it should not trigger a special fx\n\t\t\t\t\t\tif(dsnDie.options.ghost)\n\t\t\t\t\t\t\treturn false;\n\n\t\t\t\t\t\t//if the special effect \"onResult\" list contains non-numeric value, we manually deal with them here\n\t\t\t\t\t\tlet manualResultTrigger = false;\n\t\t\t\t\t\t//Keep Highest. Discarded dice are already filtered out\n\t\t\t\t\t\tif(sfx.onResult.includes(\"kh\"))\n\t\t\t\t\t\t\tmanualResultTrigger = dsnDie.options?.modifiers?.includes(\"kh\");\n\t\t\t\t\t\t//Keep Lowest. Discarded dice are already filtered out\n\t\t\t\t\t\tif(sfx.onResult.includes(\"kl\"))\n\t\t\t\t\t\t\tmanualResultTrigger = dsnDie.options?.modifiers?.includes(\"kl\");\n\n\t\t\t\t\t\tif(manualResultTrigger)\n\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t//if the result is in the triggers value, we keep the fx. Special case: double d10 for a d100 roll\n\t\t\t\t\t\tif(sfx.diceType == \"d100\"){\n\t\t\t\t\t\t\tif(dsnDie.d100Result && sfx.onResult.includes(dsnDie.d100Result.toString()))\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(sfx.diceType == dsnDie.type && sfx.onResult.includes(dsnDie.result.toString()))\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t//if a special effect was manually triggered for this dice, we also include it\n\t\t\t\t\t\tif(dsnDie.options.sfx && dsnDie.options.sfx.id == sfx.diceType && sfx.onResult.includes(dsnDie.options.sfx.result.toString()))\n\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t});\n\t\t\t\t\t//Now that we have a filtered list of sfx to play, we make a final list of all sfx for this die and we remove the duplicates\n\t\t\t\t\tif(dsnDie.options.sfx && dsnDie.options.sfx.specialEffect)\n\t\t\t\t\t\tspecialEffects.push({\n\t\t\t\t\t\t\tspecialEffect:dsnDie.options.sfx.specialEffect,\n\t\t\t\t\t\t\toptions:dsnDie.options.sfx.options\n\t\t\t\t\t\t});\n\t\t\t\t\tif(specialEffects.length){\n\t\t\t\t\t\t//remove duplicate\n\t\t\t\t\t\tspecialEffects = specialEffects.filter((v, i, a) => a.indexOf(v) === i);\n\t\t\t\t\t\tmergedRollCommands[i][j].dice[k].specialEffects = specialEffects;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn mergedRollCommands;\n\t}\n}\n","export class Accumulator {\n constructor(delay, onEnd) {\n this._timeout = null;\n this._delay = delay;\n this._onEnd = onEnd;\n this._items = [];\n }\n\n addItem(item) {\n this._items.push(item);\n if (this._timeout)\n clearTimeout(this._timeout);\n let callback = function () {\n this._onEnd(this._items)\n this._timeout = null\n this._items = [];\n }.bind(this);\n if (this._delay)\n this._timeout = setTimeout(callback, this._delay);\n else\n callback();\n }\n}","import { TEXTURELIST, COLORSETS } from './DiceColors.js';\n/**\n * Generic utilities class...\n */\n export class Utils {\n\n /**\n * Migrate old 1.0 or 2.0 setting to new 4.0 format.\n */\n static async migrateOldSettings() {\n\n //migrate settings to flags. This is a scoped migration, no GM needed\n let userSettings = game.settings.get(\"dice-so-nice\", \"settings\");\n if(userSettings.hasOwnProperty(\"enabled\")){\n await game.user.setFlag(\"dice-so-nice\", \"settings\", userSettings);\n await game.settings.set(\"dice-so-nice\",\"settings\",{});\n }\n\n let formatversion = game.settings.get(\"dice-so-nice\", \"formatVersion\");\n\n if (formatversion == \"\" || formatversion != \"4.1\") { //Never updated or first install\n if (!game.user.isGM) {\n ui.notifications.warn(game.i18n.localize(\"DICESONICE.migrateMessageNeedGM\"));\n return false;\n }\n } else if (formatversion == \"4.1\") {\n //Fuck it, lets do this so I'm sure it it not because of DsN itself.\n if (game.user.isGM) {\n await Promise.all(game.users.map(async (user) => {\n let appearance = user.getFlag(\"dice-so-nice\", \"appearance\") ? foundry.utils.duplicate(user.getFlag(\"dice-so-nice\", \"appearance\")) : null;\n if (appearance && appearance.hasOwnProperty(\"labelColor\")) {\n let data = {\n \"-=colorset\":null,\n \"-=diceColor\":null,\n \"-=edgeColor\":null,\n \"-=font\":null,\n \"-=labelColor\":null,\n \"-=material\":null,\n \"-=outlineColor\":null,\n \"-=system\":null,\n \"-=texture\":null\n };\n await user.setFlag(\"dice-so-nice\", \"appearance\", data);\n }\n }));\n } else {\n let appearance = game.user.getFlag(\"dice-so-nice\", \"appearance\") ? foundry.utils.duplicate(game.user.getFlag(\"dice-so-nice\", \"appearance\")) : null;\n if (appearance && appearance.hasOwnProperty(\"labelColor\")) {\n let data = {\n \"-=colorset\":null,\n \"-=diceColor\":null,\n \"-=edgeColor\":null,\n \"-=font\":null,\n \"-=labelColor\":null,\n \"-=material\":null,\n \"-=outlineColor\":null,\n \"-=system\":null,\n \"-=texture\":null\n };\n await game.user.setFlag(\"dice-so-nice\", \"appearance\", data);\n }\n }\n return true;\n }\n let migrated = false;\n \n if(formatversion == \"\"){\n //v1 to v2\n let settings = game.user.getFlag(\"dice-so-nice\", \"settings\") ? foundry.utils.duplicate(game.user.getFlag(\"dice-so-nice\", \"settings\")):{};\n if (settings.diceColor || settings.labelColor) {\n let newSettings = foundry.utils.mergeObject(game.dice3d.constructor.DEFAULT_OPTIONS, settings, { insertKeys: false, insertValues: false,performDeletions:true });\n let appearance = foundry.utils.mergeObject(game.dice3d.constructor.DEFAULT_APPEARANCE(), settings, { insertKeys: false, insertValues: false,performDeletions:true});\n await game.settings.set(\"dice-so-nice\", \"settings\", foundry.utils.mergeObject(newSettings, { \"-=dimensions\": null, \"-=fxList\": null },{performDeletions:true}));\n await game.user.setFlag(\"dice-so-nice\", \"appearance\", appearance);\n migrated = true;\n }\n\n //v2 to v4\n await Promise.all(game.users.map(async (user) => {\n let appearance = user.getFlag(\"dice-so-nice\", \"appearance\") ? foundry.utils.duplicate(user.getFlag(\"dice-so-nice\", \"appearance\")) : null;\n if (appearance && appearance.hasOwnProperty(\"labelColor\")) {\n let data = {\n global: appearance\n };\n await user.unsetFlag(\"dice-so-nice\", \"appearance\");\n await user.setFlag(\"dice-so-nice\", \"appearance\", data);\n migrated = true;\n }\n\n let sfxList = user.getFlag(\"dice-so-nice\", \"sfxList\") ? foundry.utils.duplicate(user.getFlag(\"dice-so-nice\", \"sfxList\")) : null;\n \n if(sfxList){\n if(!Array.isArray(sfxList))\n sfxList = Object.values(sfxList);\n sfxList.forEach((sfx)=>{\n sfx.onResult = [sfx.onResult];\n });\n await user.unsetFlag(\"dice-so-nice\", \"sfxList\");\n await user.setFlag(\"dice-so-nice\", \"sfxList\", sfxList);\n migrated = true;\n }\n }));\n }\n //v4 to v4.1 (fix)\n //Remove the extra properties, no idea why tho\n await Promise.all(game.users.map(async (user) => {\n let appearance = user.getFlag(\"dice-so-nice\", \"appearance\") ? foundry.utils.duplicate(user.getFlag(\"dice-so-nice\", \"appearance\")) : null;\n if (appearance && appearance.hasOwnProperty(\"labelColor\")) {\n let data = {\n \"-=colorset\":null,\n \"-=diceColor\":null,\n \"-=edgeColor\":null,\n \"-=font\":null,\n \"-=labelColor\":null,\n \"-=material\":null,\n \"-=outlineColor\":null,\n \"-=system\":null,\n \"-=texture\":null\n };\n await user.setFlag(\"dice-so-nice\", \"appearance\", data);\n }\n }));\n\n game.settings.set(\"dice-so-nice\", \"formatVersion\", \"4.1\");\n if(migrated)\n ui.notifications.info(game.i18n.localize(\"DICESONICE.migrateMessage\"));\n return true;\n }\n\n\n /**\n *\n * @param cfg\n * @returns {{}}\n */\n static localize(cfg) {\n return Object.keys(cfg).reduce((i18nCfg, key) => {\n i18nCfg[key] = game.i18n.localize(cfg[key]);\n return i18nCfg;\n }, {}\n );\n };\n\n /**\n * Get the contrasting color for any hex color.\n *\n * @returns {String} The contrasting color (black or white)\n */\n static contrastOf(color) {\n\n if (color.slice(0, 1) === '#') {\n color = color.slice(1);\n }\n\n if (color.length === 3) {\n color = color.split('').map(function (hex) {\n return hex + hex;\n }).join('');\n }\n\n const r = parseInt(color.substr(0, 2), 16);\n const g = parseInt(color.substr(2, 2), 16);\n const b = parseInt(color.substr(4, 2), 16);\n\n var yiq = ((r * 299) + (g * 587) + (b * 114)) / 1000;\n\n return (yiq >= 128) ? '#000000' : '#FFFFFF';\n };\n\n static prepareTextureList() {\n return Object.keys(TEXTURELIST).reduce((i18nCfg, key) => {\n i18nCfg[key] = game.i18n.localize(TEXTURELIST[key].name);\n return i18nCfg;\n }, {}\n );\n };\n\n static prepareFontList() {\n let fontList = {\n \"auto\": game.i18n.localize(\"DICESONICE.FontAuto\")\n };\n return foundry.utils.mergeObject(fontList,FontConfig.getAvailableFontChoices());\n };\n\n static prepareColorsetList() {\n let groupedSetsList = Object.values(COLORSETS);\n groupedSetsList.sort((set1, set2) => {\n if (game.i18n.localize(set1.description) < game.i18n.localize(set2.description)) return -1;\n if (game.i18n.localize(set1.description) > game.i18n.localize(set2.description)) return 1;\n });\n let preparedList = {};\n for (let i = 0; i < groupedSetsList.length; i++) {\n if (groupedSetsList[i].visibility == 'hidden')\n continue;\n let locCategory = game.i18n.localize(groupedSetsList[i].category);\n if (!preparedList.hasOwnProperty(locCategory))\n preparedList[locCategory] = {};\n preparedList[locCategory][groupedSetsList[i].name] = game.i18n.localize(groupedSetsList[i].description);\n }\n\n return preparedList;\n };\n\n static prepareSystemList() {\n let systems = game.dice3d.box.dicefactory.systems;\n return Object.keys(systems).reduce((i18nCfg, key) => {\n i18nCfg[key] = game.i18n.localize(systems[key].name);\n return i18nCfg;\n }, {});\n };\n\n static filterObject(obj, predicate) {\n return Object.keys(obj)\n .filter(key => predicate(obj[key]))\n .reduce((res, key) => (res[key] = obj[key], res), {});\n }\n\n static actionSaveAs(name){\n let savesObject = game.user.getFlag(\"dice-so-nice\", \"saves\");\n let saves;\n if (!savesObject) {\n saves = new Map();\n } else {\n //workaround for https://gitlab.com/foundrynet/foundryvtt/-/issues/5464\n saves = new Map(Object.entries(savesObject));\n }\n //save current settings first\n \n let saveObject = {\n appearance: game.user.getFlag(\"dice-so-nice\", \"appearance\"),\n sfxList: game.user.getFlag(\"dice-so-nice\", \"sfxList\"),\n settings: game.settings.get(\"dice-so-nice\", \"settings\")\n };\n\n saves.set(name, saveObject);\n game.user.unsetFlag(\"dice-so-nice\", \"saves\").then(() => {\n game.user.setFlag(\"dice-so-nice\", \"saves\", Object.fromEntries(saves));\n });\n }\n\n static async actionDeleteSave(name){\n let savesObject = game.user.getFlag(\"dice-so-nice\", \"saves\");\n let saves = new Map(Object.entries(savesObject));\n saves.delete(name);\n game.user.unsetFlag(\"dice-so-nice\", \"saves\").then(async () => {\n await game.user.setFlag(\"dice-so-nice\", \"saves\", Object.fromEntries(saves));\n ui.notifications.info(game.i18n.localize(\"DICESONICE.saveMessage\"));\n });\n }\n\n static async actionLoadSave(name) {\n let savesObject = game.user.getFlag(\"dice-so-nice\", \"saves\");\n let save = new Map(Object.entries(savesObject)).get(name);\n\n if (save.appearance) {\n await game.user.unsetFlag(\"dice-so-nice\", \"appearance\");\n await game.user.setFlag(\"dice-so-nice\", \"appearance\", save.appearance);\n }\n if (save.sfxList) {\n await game.user.unsetFlag(\"dice-so-nice\", \"sfxList\");\n await game.user.setFlag(\"dice-so-nice\", \"sfxList\", save.sfxList);\n }\n if (save.settings) {\n await game.user.unsetFlag(\"dice-so-nice\", \"settings\");\n await game.user.setFlag(\"dice-so-nice\", \"settings\", save.settings);\n }\n }\n}\n","import { DataTexture, LinearFilter, LinearMipMapLinearFilter, MathUtils, RepeatWrapping, RGBAFormat, UnsignedByteType, UVMapping, Vector2 } from 'three';\n\n/**\n * MIT License\n * Copyright (c) 2019 David Lenaerts\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @classdesc\n * ThinFilmFresnelMap is a lookup texture containing the reflection colour. The texture index value\n * is dot(normal, view). The texture values are stored in approximated gamma space (power 2.0), so\n * the sampled value needs to be multiplied with itself before use. The sampled value should replace\n * the fresnel factor in a PBR material.\n *\n * @property filmThickness The thickness of the thin film layer in nanometers. Defaults to 380.\n * @property refractiveIndexFilm The refractive index of the thin film. Defaults to 2.\n * @property refractiveIndexBase The refractive index of the material under the film. Defaults to 3.\n *\n * @constructor\n * @param filmThickness The thickness of the thin film layer in nanometers. Defaults to 380.\n * @param refractiveIndexFilm The refractive index of the thin film. Defaults to 2.\n * @param refractiveIndexBase The refractive index of the material under the film. Defaults to 3.\n * @param size The width of the texture. Defaults to 64.\n *\n * @extends DataTexture\n *\n * @author David Lenaerts <http://www.derschmale.com>\n * @author Mathias Latournerie\n */\nclass ThinFilmFresnelMap extends DataTexture {\n\n constructor(filmThickness = 480, refractiveIndexFilm = 1.3, refractiveIndexBase = 3, size = 64) {\n\n const data = new Uint8Array(size * size * 4);\n super(data, size, size, RGBAFormat, UnsignedByteType, UVMapping, RepeatWrapping, RepeatWrapping, LinearFilter, LinearMipMapLinearFilter);\n\n this._filmThickness = filmThickness;\n this._refractiveIndexFilm = refractiveIndexFilm;\n this._refractiveIndexBase = refractiveIndexBase;\n this._size = size;\n this._data = data;\n\n this._updateData();\n\n this.generateMipmaps = true;\n this.needsUpdate = true;\n }\n\n get filmThickness() {\n return this._filmThickness;\n }\n set filmThickness(value) {\n this._filmThickness = value;\n this.updateSettings(this._filmThickness, this._refractiveIndexFilm, this._refractiveIndexBase);\n }\n\n get refractiveIndexFilm() {\n return this._refractiveIndexFilm;\n }\n set refractiveIndexFilm(value) {\n this._refractiveIndexFilm = value;\n this.updateSettings(this._filmThickness, this._refractiveIndexFilm, this._refractiveIndexBase);\n }\n\n get refractiveIndexBase() {\n return this._refractiveIndexBase;\n }\n set refractiveIndexBase(value) {\n this._refractiveIndexBase = value;\n this.updateSettings(this._filmThickness, this._refractiveIndexFilm, this._refractiveIndexBase);\n }\n\n\n /**\n * Regenerates the lookup texture given new data.\n * @param filmThickness The thickness of the thin film layer in nanometers. Defaults to 380.\n * @param refractiveIndexFilm The refractive index of the thin film. Defaults to 2.\n * @param refractiveIndexBase The refractive index of the material under the film. Defaults to 3.\n */\n updateSettings(filmThickness, refractiveIndexFilm, refractiveIndexBase) {\n this._filmThickness = filmThickness || 380;\n this._refractiveIndexFilm = refractiveIndexFilm || 2;\n this._refractiveIndexBase = refractiveIndexBase || 3;\n this._updateData();\n };\n\n /**\n * @private\n */\n _fresnelRefl(refractiveIndex1, refractiveIndex2, cos1, cos2, R, phi) {\n // r is amplitudinal, R is power\n var sin1Sqr = 1.0 - cos1 * cos1; // = sin^2(incident)\n var refrRatio = refractiveIndex1 / refractiveIndex2;\n\n if (refrRatio * refrRatio * sin1Sqr > 1.0) {\n // total internal reflection\n R.x = 1.0;\n R.y = 1.0;\n\n var sqrRefrRatio = refrRatio * refrRatio;\n // it looks like glsl's atan ranges are different from those in JS?\n phi.x = 2.0 * Math.atan(-sqrRefrRatio * Math.sqrt(sin1Sqr - 1.0 / sqrRefrRatio) / cos1);\n phi.y = 2.0 * Math.atan(-Math.sqrt(sin1Sqr - 1.0 / sqrRefrRatio) / cos1);\n } else {\n var r_p = (refractiveIndex2 * cos1 - refractiveIndex1 * cos2) / (refractiveIndex2 * cos1 + refractiveIndex1 * cos2);\n var r_s = (refractiveIndex1 * cos1 - refractiveIndex2 * cos2) / (refractiveIndex1 * cos1 + refractiveIndex2 * cos2);\n\n phi.x = r_p < 0.0 ? Math.PI : 0.0;\n phi.y = r_s < 0.0 ? Math.PI : 0.0;\n\n R.x = r_p * r_p;\n R.y = r_s * r_s;\n }\n };\n\n /**\n * @private\n */\n _updateData() {\n var filmThickness = this._filmThickness;\n var refractiveIndexFilm = this._refractiveIndexFilm;\n var refractiveIndexBase = this._refractiveIndexBase;\n var size = this._size;\n\n // approximate CIE XYZ weighting functions from: http://jcgt.org/published/0002/02/01/paper.pdf\n function xFit_1931(lambda) {\n var t1 = (lambda - 442.0) * ((lambda < 442.0) ? 0.0624 : 0.0374);\n var t2 = (lambda - 599.8) * ((lambda < 599.8) ? 0.0264 : 0.0323);\n var t3 = (lambda - 501.1) * ((lambda < 501.1) ? 0.0490 : 0.0382);\n return 0.362 * Math.exp(-0.5 * t1 * t1) + 1.056 * Math.exp(-0.5 * t2 * t2) - 0.065 * Math.exp(-0.5 * t3 * t3);\n }\n\n function yFit_1931(lambda) {\n var t1 = (lambda - 568.8) * ((lambda < 568.8) ? 0.0213 : 0.0247);\n var t2 = (lambda - 530.9) * ((lambda < 530.9) ? 0.0613 : 0.0322);\n return 0.821 * Math.exp(-0.5 * t1 * t1) + 0.286 * Math.exp(-0.5 * t2 * t2);\n }\n\n function zFit_1931(lambda) {\n var t1 = (lambda - 437.0) * ((lambda < 437.0) ? 0.0845 : 0.0278);\n var t2 = (lambda - 459.0) * ((lambda < 459.0) ? 0.0385 : 0.0725);\n return 1.217 * Math.exp(-0.5 * t1 * t1) + 0.681 * Math.exp(-0.5 * t2 * t2);\n }\n\n var data = this._data;\n var phi12 = new Vector2();\n var phi21 = new Vector2();\n var phi23 = new Vector2();\n var R12 = new Vector2();\n var T12 = new Vector2();\n var R23 = new Vector2();\n var R_bi = new Vector2();\n var T_tot = new Vector2();\n var R_star = new Vector2();\n var R_bi_sqr = new Vector2();\n var R_12_star = new Vector2();\n var R_star_t_tot = new Vector2();\n\n var refrRatioSqr = 1.0 / (refractiveIndexFilm * refractiveIndexFilm);\n var refrRatioSqrBase = (refractiveIndexFilm * refractiveIndexFilm) / (refractiveIndexBase * refractiveIndexBase);\n\n // RGB is too limiting, so we use the entire spectral domain, but using limited samples (64) to\n // create more pleasing bands\n var numBands = 64;\n var waveLenRange = 780 - 380; // the entire visible range\n\n for (var i = 0; i < size; ++i) {\n for (var k = 0; k < size; ++k) {\n var cosThetaI = i / size;\n var cosThetaT = Math.sqrt(1 - refrRatioSqr * (1.0 - cosThetaI * cosThetaI));\n var cosThetaT2 = Math.sqrt(1 - refrRatioSqrBase * (1.0 - cosThetaT * cosThetaT));\n\n // this is essentially the extra distance traveled by a ray if it bounds through the film\n var pathDiff = 2.0 * refractiveIndexFilm * ((waveLenRange / size * k) + 280) * cosThetaT;\n var pathDiff2PI = 2.0 * Math.PI * pathDiff;\n\n this._fresnelRefl(1.0, refractiveIndexFilm, cosThetaI, cosThetaT, R12, phi12);\n T12.x = 1.0 - R12.x;\n T12.y = 1.0 - R12.y;\n phi21.x = Math.PI - phi12.x;\n phi21.y = Math.PI - phi12.y;\n\n // this concerns the base layer\n this._fresnelRefl(refractiveIndexFilm, refractiveIndexBase, cosThetaT, cosThetaT2, R23, phi23);\n R_bi.x = Math.sqrt(R23.x * R12.x);\n R_bi.y = Math.sqrt(R23.y * R12.y);\n T_tot.x = Math.sqrt(T12.x * T12.x);\n T_tot.y = Math.sqrt(T12.y * T12.y);\n R_star.x = (T12.x * T12.x * R23.x) / (1.0 - R23.x * R12.x);\n R_star.y = (T12.y * T12.y * R23.y) / (1.0 - R23.y * R12.y);\n R_bi_sqr.x = R_bi.x * R_bi.x;\n R_bi_sqr.y = R_bi.y * R_bi.y;\n R_12_star.x = R12.x + R_star.x;\n R_12_star.y = R12.y + R_star.y;\n R_star_t_tot.x = R_star.x - T_tot.x;\n R_star_t_tot.y = R_star.y - T_tot.y;\n var x = 0, y = 0, z = 0;\n var totX = 0, totY = 0, totZ = 0;\n\n for (var j = 0; j < numBands; ++j) {\n var waveLen = 380 + j / (numBands - 1) * waveLenRange;\n var deltaPhase = pathDiff2PI / waveLen;\n\n var cosPhiX = Math.cos(deltaPhase + phi23.x + phi21.x);\n var cosPhiY = Math.cos(deltaPhase + phi23.y + phi21.y);\n var valX = R_12_star.x + 2.0 * (R_bi.x * cosPhiX - R_bi_sqr.x) / (1.0 - 2 * R_bi.x * cosPhiX + R_bi_sqr.x) * R_star_t_tot.x;\n var valY = R_12_star.y + 2.0 * (R_bi.y * cosPhiY - R_bi_sqr.y) / (1.0 - 2 * R_bi.y * cosPhiY + R_bi_sqr.y) * R_star_t_tot.y;\n var v = .5 * (valX + valY);\n\n var wx = xFit_1931(waveLen);\n var wy = yFit_1931(waveLen);\n var wz = zFit_1931(waveLen);\n\n totX += wx;\n totY += wy;\n totZ += wz;\n\n x += wx * v;\n y += wy * v;\n z += wz * v;\n }\n\n x /= totX;\n y /= totY;\n z /= totZ;\n\n var r = 3.2406 * x - 1.5372 * y - 0.4986 * z;\n var g = -0.9689 * x + 1.8758 * y + 0.0415 * z;\n var b = 0.0557 * x - 0.2040 * y + 1.0570 * z;\n\n r = MathUtils.clamp(r, 0.0, 1.0);\n g = MathUtils.clamp(g, 0.0, 1.0);\n b = MathUtils.clamp(b, 0.0, 1.0);\n\n // linear to gamma\n r = Math.pow(r, 0.7);\n g = Math.pow(g, 0.7);\n b = Math.pow(b, 0.7);\n\n // CIE XYZ to linear rgb conversion matrix:\n // 3.2406 -1.5372 -0.4986\n // -0.9689 1.8758 0.0415\n // 0.0557 -0.2040 1.0570\n\n var l = i * 4 + (k * size) * 4;\n data[l] = Math.floor(r * 0xff);\n data[l + 1] = Math.floor(g * 0xff);\n data[l + 2] = Math.floor(b * 0xff);\n data[l + 3] = 0xff;\n }\n }\n\n this.needsUpdate = true;\n };\n}\n\nexport { ThinFilmFresnelMap };","export class DiceTour extends Tour {\n //This class overcharge the \"step\" data structure with the following properties:\n // - action: \"click\" or \"scrollTo\"\n // - target: CSS selector of the element to use for the action. If not set, the selector is used for the action\n\n /**\n * Wait for an element to exists in the DOM then resolves the promise\n * @param {string} selector CSS selector of the element to wait for\n * @returns {Promise<void>}\n */\n async waitForElement(selector) {\n return new Promise((resolve, reject) => {\n let element = document.querySelector(selector);\n if (element) {\n resolve();\n return;\n }\n\n const observer = new MutationObserver((mutations, observer) => {\n document.querySelectorAll(selector).forEach((el) => {\n resolve(el);\n observer.disconnect();\n });\n })\n\n observer.observe(document.body, {\n childList: true,\n subtree: true\n });\n });\n }\n\n async _preStep() {\n await super._preStep();\n await this.waitForElement(this.currentStep.selector);\n }\n\n async _postStep() {\n await super._postStep();\n if (this.stepIndex < 0 || !this.hasNext)\n return;\n\n if (!this.currentStep.action)\n return;\n\n if(this.triggerReset) {\n this.triggerReset = false;\n return;\n }\n let target = this.currentStep.target ? this.currentStep.target : this.currentStep.selector;\n switch (this.currentStep.action) {\n case \"click\":\n document.querySelector(target).click();\n break;\n case \"scrollTo\":\n document.querySelector(target).scrollIntoView({ block: \"start\", inline: \"nearest\" });\n break;\n }\n }\n\n /**\n * Detect when a reset is triggered and stop the actions in _postStep\n */\n async reset() {\n if(this.status != \"completed\")\n this.triggerReset = true;\n await super.reset();\n }\n}","import { DiceTour } from \"./DiceTour.js\";\n\nexport class DiceTourMain extends DiceTour {\n constructor() {\n super({\n title: \"How to use Dice So Nice!\",\n description: \"Learn how to customize your 3D dice in this short tour of the module\",\n canBeResumed: false,\n display: true,\n steps: [\n {\n id: \"goto-settings\",\n selector: \"[data-tab=\\\"settings\\\"]\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleGotoSettings\"),\n content: game.i18n.localize(\"DICESONICE.TourMainContentGotoSettings\"),\n action: \"click\"\n },\n {\n id: \"goto-configure\",\n selector: \"[data-action=\\\"configure\\\"]\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleGotoConfigure\"),\n content: game.i18n.localize(\"DICESONICE.TourMainContentGotoConfigure\"),\n action: \"click\"\n },\n {\n id: \"goto-modulessettings\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleGotoModulesSettings\"),\n selector: \".category-filter [data-category=\\\"dice-so-nice\\\"]\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentGotoModulesSettings\"),\n action: \"click\"\n },\n {\n id: \"goto-dicesonice\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleGotoDiceSoNice\"),\n selector: \"#client-settings form.categories div.scrollable\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentGotoDiceSoNice\"),\n },\n {\n id: \"goto-dicesonice-settings\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleGotoDiceSoNiceSettings\"),\n selector: \"[data-key=\\\"dice-so-nice.dice-so-nice\\\"]\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentGotoDiceSoNiceSettings\"),\n action: \"click\"\n },\n {\n id: \"show-3d-dice\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleShow3DDice\"),\n selector: \"#dice-configuration-canvas\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentShow3DDice\")\n },\n {\n id: \"show-appearance\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleShowAppearance\"),\n selector: \"#dsn-appearance-content\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentShowAppearance\"),\n action: \"click\",\n target: \".dice-so-nice a[data-tab=\\\"preferences\\\"]\"\n },\n {\n id:\"show-preferences\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleShowPreferences\"),\n selector: \".dice-so-nice div.tab.active[data-tab=\\\"preferences\\\"]\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentShowPreferences\"),\n action: \"click\",\n target: \".dice-so-nice a[data-tab=\\\"sfx\\\"]\"\n },\n {\n id: \"show-sfx\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleShowSFX\"),\n selector: \".dice-so-nice div.tab.active[data-tab=\\\"sfx\\\"]\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentShowSFX\"),\n action: \"click\",\n target: \".dice-so-nice a[data-tab=\\\"performance\\\"]\"\n },\n {\n id: \"show-performance\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleShowPerformance\"),\n selector: \".dice-so-nice div.tab.active[data-tab=\\\"performance\\\"]\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentShowPerformance\"),\n action: \"click\",\n target: \".dice-so-nice a[data-tab=\\\"backup\\\"]\"\n },\n {\n id: \"show-backup\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleShowBackup\"),\n selector: \".dice-so-nice div.tab.active[data-tab=\\\"backup\\\"]\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentShowBackup\")\n },\n {\n id: \"end-tour\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleEndTour\"),\n selector: \".dice-so-nice div.tab.active[data-tab=\\\"backup\\\"]\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentEndTour\")\n }\n ]\n });\n }\n /**\n * Override the DiceTour _preStep method to wait for the element to exists in the DOM\n */\n async _preStep() {\n switch (this.currentStep.id) {\n case \"goto-settings\":\n //start on the chat tab\n document.querySelector('a[data-tab=\"chat\"]').click();\n break;\n case \"goto-dicesonice\":\n //There is no native selector available for this step so we add something to identify the element with jQuery\n $(\"[data-tab=\\\"modules\\\"] h2:contains('Dice So Nice!')\").addClass(\"dice-tour\");\n break;\n }\n\n await super._preStep();\n }\n\n async _postStep() {\n if(!this.currentStep)\n return;\n switch (this.currentStep.id) {\n case \"end-tour\":\n //end the tour with a bang\n document.querySelector('.dice-so-nice button[data-test]').click();\n break;\n }\n await super._postStep();\n }\n}","import { DiceFactory } from './DiceFactory.js';\nimport { DiceBox } from './DiceBox.js';\nimport { DiceColors, TEXTURELIST, COLORSETS } from './DiceColors.js';\nimport { DiceNotation } from './DiceNotation.js';\nimport { DiceSFXManager } from './DiceSFXManager.js';\nimport { Accumulator } from './Accumulator.js';\nimport { Utils } from './Utils.js';\nimport { ThinFilmFresnelMap } from './libs/ThinFilmFresnelMap.js';\nimport { TextureLoader } from 'three';\nimport { DiceTourMain } from './tours/DiceTourMain.js';\n/**\n * Main class to handle 3D Dice animations.\n */\nexport class Dice3D {\n\n static get DEFAULT_OPTIONS() {\n const quality = {};\n switch(game.settings.get(\"core\", \"performanceMode\")) {\n case 0:\n quality.bumpMapping = false;\n quality.shadowQuality = \"low\";\n quality.glow = false;\n quality.antialiasing = \"none\";\n quality.useHighDPI = false;\n quality.imageQuality = \"low\";\n break;\n case 1:\n quality.bumpMapping = true;\n quality.shadowQuality = \"low\";\n quality.glow = false;\n quality.antialiasing = \"none\";\n quality.useHighDPI = false;\n quality.imageQuality = \"medium\";\n break;\n case 2:\n case 3:\n quality.bumpMapping = true;\n quality.shadowQuality = \"high\";\n quality.glow = true;\n quality.antialiasing = game.canvas.app.renderer.context.webGLVersion===2 ?\"msaa\":\"smaa\";\n quality.useHighDPI = true;\n quality.imageQuality = \"high\";\n break;\n }\n return {\n enabled: true,\n showExtraDice: game.dice3d && game.dice3d.hasOwnProperty(\"defaultShowExtraDice\") ? game.dice3d.defaultShowExtraDice : false,\n hideAfterRoll: true,\n timeBeforeHide: 2000,\n hideFX: 'fadeOut',\n autoscale: true,\n scale: 75,\n speed: 1,\n imageQuality: quality.imageQuality,\n shadowQuality: quality.shadowQuality,\n bumpMapping: quality.bumpMapping,\n sounds: true,\n soundsSurface: 'felt',\n soundsVolume: 0.5,\n canvasZIndex: 'over',\n throwingForce: 'medium',\n useHighDPI: quality.useHighDPI,\n antialiasing: quality.antialiasing,\n glow: quality.glow,\n showOthersSFX: true,\n immersiveDarkness: true,\n muteSoundSecretRolls: false,\n enableFlavorColorset: true,\n rollingArea: false\n };\n }\n\n static DEFAULT_APPEARANCE(user = game.user) {\n return {\n global: {\n labelColor: Utils.contrastOf(user.color.toString()),\n diceColor: user.color.toString(),\n outlineColor: user.color.toString(),\n edgeColor: user.color.toString(),\n texture: \"none\",\n material: \"auto\",\n font: \"auto\",\n colorset: \"custom\",\n system: \"standard\"\n }\n };\n }\n\n static ALL_DEFAULT_OPTIONS(user = game.user) {\n let options = foundry.utils.mergeObject(Dice3D.DEFAULT_OPTIONS, { appearance: Dice3D.DEFAULT_APPEARANCE(user) }, { performDeletions: true });\n options.appearance.global.system = game.dice3d.DiceFactory.preferredSystem;\n options.appearance.global.colorset = game.dice3d.DiceFactory.preferredColorset;\n return options;\n }\n\n static CONFIG(user = game.user) {\n let userSettings = user.getFlag(\"dice-so-nice\", \"settings\") ? foundry.utils.duplicate(user.getFlag(\"dice-so-nice\", \"settings\")) : null;\n let config = foundry.utils.mergeObject(Dice3D.DEFAULT_OPTIONS, userSettings, { performDeletions: true });\n foundry.utils.mergeObject(config, { \"-=appearance\": null, \"-=sfxLine\": null }, { performDeletions: true });\n return config;\n }\n\n static APPEARANCE(user = game.user) {\n let userAppearance = user.getFlag(\"dice-so-nice\", \"appearance\") ? foundry.utils.duplicate(user.getFlag(\"dice-so-nice\", \"appearance\")) : null;\n let appearance = foundry.utils.mergeObject(Dice3D.DEFAULT_APPEARANCE(user), userAppearance, { performDeletions: true });\n return foundry.utils.mergeObject(appearance, { \"-=dimensions\": null }, { performDeletions: true });\n }\n\n static SFX(user = game.user) {\n let sfxArray;\n if (Dice3D.CONFIG().showOthersSFX || user.id == game.user.id)\n sfxArray = user.getFlag(\"dice-so-nice\", \"sfxList\") ? foundry.utils.duplicate(user.getFlag(\"dice-so-nice\", \"sfxList\")) : [];\n else\n sfxArray = [];\n if (!Array.isArray(sfxArray)) {\n sfxArray = [];\n }\n return sfxArray;\n }\n\n /**\n * Get the full customizations settings for the _showAnimation method \n */\n static ALL_CUSTOMIZATION(user = game.user, dicefactory = null) {\n let specialEffects = Dice3D.SFX(user) || [];\n game.users.forEach((other) => {\n if (other.isGM && other.id != user.id) {\n let GMSFX = Dice3D.SFX(other);\n if (Array.isArray(GMSFX)) {\n GMSFX = GMSFX.filter(sfx => sfx.options && sfx.options.isGlobal);\n specialEffects = specialEffects.concat(GMSFX);\n }\n }\n });\n let config = foundry.utils.mergeObject({ appearance: Dice3D.APPEARANCE(user) }, { specialEffects: specialEffects }, { performDeletions: true });\n if (dicefactory && !game.user.getFlag(\"dice-so-nice\", \"appearance\")) {\n if (dicefactory.preferredSystem != \"standard\")\n config.appearance.global.system = dicefactory.preferredSystem;\n if (dicefactory.preferredColorset != \"custom\")\n config.appearance.global.colorset = dicefactory.preferredColorset;\n }\n return config;\n }\n\n static ALL_CONFIG(user = game.user) {\n let ret = foundry.utils.mergeObject(Dice3D.CONFIG(user), { appearance: Dice3D.APPEARANCE(user) }, { performDeletions: true });\n ret.specialEffects = Dice3D.SFX(user);\n return ret;\n }\n\n /**\n * Register a new system\n * The id is to be used with addDicePreset\n * The name can be a localized string\n * @param {Object} system {id, name}\n * @param {Boolean} mode \"default,preferred\". Default will add the system as a choice. Preferred will be enabled for all users unless they change their settings.\n */\n addSystem(system, mode = \"default\") {\n //retrocompatibility with API version < 3.1\n if (typeof mode == \"boolean\") {\n mode = mode ? \"preferred\" : \"default\";\n }\n\n this.DiceFactory.addSystem(system, mode);\n }\n\n /**\n * Register a new dice preset\n * Type should be a known dice type (d4,d6,d8,d10,d12,d14,d16,d20,d24,d30,d100)\n * Labels contains either strings (unicode) or a path to a texture (png, gif, jpg, webp)\n * The texture file size should be 256*256\n * The system should be a system id already registered\n * @param {Object} dice {type:\"\",labels:[],system:\"\"}\n */\n addDicePreset(dice, shape = null) {\n this.DiceFactory.addDicePreset(dice, shape);\n }\n\n /**\n * Add a texture to the list of textures and preload it\n * @param {String} textureID \n * @param {Object} textureData \n * @returns {Promise}\n */\n addTexture(textureID, textureData) {\n if (!textureData.bump)\n textureData.bump = '';\n return new Promise((resolve) => {\n let textureEntry = {};\n textureEntry[textureID] = textureData;\n TEXTURELIST[textureID] = textureData;\n DiceColors.loadTextures(textureEntry, (images) => {\n resolve();\n });\n });\n }\n\n /**\n * Add a colorset (theme)\n * @param {Object} colorset \n * @param {Object} mode = \"default\", \"preferred\"\n */\n async addColorset(colorset, mode = \"default\") {\n let defaultValues = {\n foreground: \"custom\",\n background: \"custom\",\n outline: \"\",\n edge: \"\",\n texture: \"custom\",\n material: \"custom\",\n font: \"custom\",\n visibility: \"visible\"\n }\n colorset = foundry.utils.mergeObject(defaultValues, colorset, { performDeletions: true });\n COLORSETS[colorset.name] = colorset;\n DiceColors.initColorSets(colorset);\n\n if (colorset.font && !FontConfig.getAvailableFonts().includes(colorset.font)) {\n await FontConfig.loadFont(colorset.font, { editor: false, fonts: [] });\n }\n if (mode == \"preferred\")\n this.DiceFactory.preferredColorset = colorset.name;\n }\n\n /**\n * Add a new type if SFX trigger that can be customized by users.\n * This trigger can then be pulled by a system, a module or a macro\n * @param {String} id : Identifier of the trigger, ex: fate3df\n * @param {String} name : Localized name of the trigger, ex: Fate Roll\n * @param {Array(String)} results : Array of possible results for this trigger, ex: [\"-3\",\"3\",\"0\"]\n */\n addSFXTrigger(id, name, results) {\n if (DiceSFXManager.EXTRA_TRIGGER_RESULTS[id])\n return;\n DiceSFXManager.EXTRA_TRIGGER_TYPE.push({ id: id, name: name });\n DiceSFXManager.EXTRA_TRIGGER_RESULTS[id] = [];\n results.forEach((res) => {\n DiceSFXManager.EXTRA_TRIGGER_RESULTS[id].push({ id: res, name: res });\n });\n }\n\n /**\n * Load a save file by its name\n * @param {String} name \n * @returns {Promise}\n */\n async loadSaveFile(name) {\n if (game.user.getFlag(\"dice-so-nice\", \"saves\").hasOwnProperty(name))\n await Utils.actionLoadSave(name);\n }\n\n\n /**\n * Constructor. Create and initialize a new Dice3d.\n */\n constructor() {\n Hooks.call(\"diceSoNiceInit\", this);\n this.dice3dRenderers = {\n \"board\": null,\n \"showcase\": null\n };\n\n this.exports = {\n \"Utils\": Utils,\n \"DiceColors\": DiceColors,\n \"TEXTURELIST\": TEXTURELIST,\n \"COLORSETS\": COLORSETS\n };\n\n this.uniforms = {\n globalBloom: { value: 1 },\n bloomStrength: { value: 2.5 },\n bloomRadius: { value: 0.5 },\n bloomThreshold: { value: 0.03 },\n iridescenceLookUp: { value: new ThinFilmFresnelMap() },\n iridescenceNoise: { value: new TextureLoader().load(\"modules/dice-so-nice/textures/noise-thin-film.webp\") },\n boost: { value: 1.5 }\n };\n\n this.hiddenAnimationQueue = [];\n this.defaultShowExtraDice = Dice3D.DEFAULT_OPTIONS.showExtraDice;\n this._buildCanvas();\n this._initListeners();\n this._buildDiceBox();\n DiceColors.loadTextures(TEXTURELIST, async (images) => {\n DiceColors.initColorSets();\n\n Hooks.call(\"diceSoNiceReady\", this);\n await this.DiceFactory._loadFonts();\n await this.DiceFactory.preloadPresets();\n });\n DiceSFXManager.init();\n this._startQueueHandler();\n this._nextAnimationHandler();\n this._welcomeMessage();\n this._registerTours();\n }\n\n get canInteract() {\n return !this.box.running;\n }\n\n /**\n * Create and inject the dice box canvas resizing to the window total size.\n *\n * @private\n */\n _buildCanvas() {\n const config = Dice3D.CONFIG();\n const sidebarWidth = $('#sidebar').width();\n const sidebarOffset = sidebarWidth > window.innerWidth / 2 ? 0 : sidebarWidth;\n const area = config.rollingArea ? config.rollingArea : {\n left: 0,\n top: 0,\n width: window.innerWidth - sidebarOffset,\n height: window.innerHeight - 1\n };\n\n if(!config.enabled){\n area.width = 1;\n area.height = 1;\n }\n\n this.canvas = $(`<div id=\"dice-box-canvas\" style=\"position: absolute; left: ${area.left}px; top: ${area.top}px; pointer-events: none;\"></div>`);\n if (config.canvasZIndex === \"over\") {\n this.canvas.css(\"z-index\", 1000);\n this.canvas.appendTo($('body'));\n }\n else {\n $(\"#board\").after(this.canvas);\n }\n this.canvas.width(area.width + 'px');\n this.canvas.height(area.height + 'px');\n }\n\n /**\n * Build the dicebox.\n *\n * @private\n */\n _buildDiceBox() {\n this.DiceFactory = new DiceFactory();\n let config = Dice3D.ALL_CONFIG();\n config.boxType = \"board\";\n this.box = new DiceBox(this.canvas[0], this.DiceFactory, config);\n this.box.initialize();\n }\n\n /**\n * Init listeners on windows resize and on click if auto hide has been disabled within the settings.\n *\n * @private\n */\n _initListeners() {\n this._rtime;\n this._timeout = false;\n $(window).resize(() => {\n this._rtime = new Date();\n if (this._timeout === false) {\n this._timeout = true;\n setTimeout(this._resizeEnd.bind(this), 1000);\n }\n });\n\n $(document).on(\"click\", \".dice-so-nice-btn-settings\", (ev) => {\n ev.preventDefault();\n const menu = game.settings.menus.get(ev.currentTarget.dataset.key);\n const app = new menu.type();\n return app.render(true);\n });\n\n $(document).on(\"click\", \".dice-so-nice-btn-tour\", (ev) => {\n ev.preventDefault();\n game.tours.get(\"dice-so-nice.dice-so-nice-tour\").start();\n });\n\n game.socket.on('module.dice-so-nice', (request) => {\n switch (request.type) {\n case \"show\":\n if (!request.users || request.users.includes(game.user.id))\n this.show(request.data, game.users.get(request.user));\n break;\n case \"update\":\n if (request.user == game.user.id || Dice3D.CONFIG().showOthersSFX)\n DiceSFXManager.init();\n if (request.user != game.user.id) {\n this.DiceFactory.preloadPresets(false, request.user);\n }\n break;\n }\n });\n\n if (game.settings.get(\"dice-so-nice\", \"allowInteractivity\")) {\n $(document).on(\"mousemove.dicesonice\", \"body\", this._onMouseMove.bind(this));\n\n $(document).on(\"mousedown.dicesonice\", \"body\", this._onMouseDown.bind(this));\n\n $(document).on(\"mouseup.dicesonice\", \"body\", this._onMouseUp.bind(this));\n }\n }\n\n _mouseNDC(event) {\n let rect = this.canvas[0].getBoundingClientRect();\n let x = ((event.clientX - rect.left) / rect.width) * 2 - 1;\n if (x > 1)\n x = 1;\n let y = - ((event.clientY - rect.top) / rect.height) * 2 + 1;\n return { x: x, y: y };\n }\n\n _onMouseMove(event) {\n if (!this.canInteract)\n return;\n this.box.onMouseMove(event, this._mouseNDC(event));\n }\n\n _onMouseDown(event) {\n if (!this.canInteract)\n return;\n let hit = this.box.onMouseDown(event, this._mouseNDC(event));\n if (hit)\n this._beforeShow();\n else {\n const config = Dice3D.CONFIG();\n if (!config.hideAfterRoll && this.canvas.is(\":visible\") && !this.box.rolling) {\n this.canvas.hide();\n this.box.clearAll();\n }\n }\n\n }\n\n _onMouseUp(event) {\n if (!this.canInteract)\n return;\n let hit = this.box.onMouseUp(event);\n if (hit)\n this._afterShow();\n }\n\n _resizeEnd() {\n if (new Date() - this._rtime < 1000) {\n setTimeout(this._resizeEnd.bind(this), 1000);\n } else {\n this._timeout = false;\n //resize ended probably, lets remake the canvas\n this.resizeAndRebuild();\n }\n }\n\n resizeAndRebuild() {\n this.canvas[0].remove();\n this.box.clearScene();\n this._buildCanvas();\n let config = Dice3D.ALL_CONFIG();\n config.boxType = \"board\";\n this.box = new DiceBox(this.canvas[0], this.DiceFactory, config);\n this.box.initialize();\n this.box.preloadSounds();\n }\n\n /**\n * Start polling and watching te queue for animation requests.\n * Each request is resolved in sequence.\n *\n * @private\n */\n _startQueueHandler() {\n this.queue = [];\n setInterval(() => {\n if (this.queue.length > 0 && !this.box.rolling) {\n let animate = this.queue.shift();\n animate();\n }\n }, 100);\n }\n\n /**\n * Show a private message to new players\n */\n _welcomeMessage() {\n if (!game.user.getFlag(\"dice-so-nice\", \"welcomeMessageShown\")) {\n if (!game.user.getFlag(\"dice-so-nice\", \"appearance\")) {\n const content = [`\n <div class=\"dice-so-nice\">\n <h3 class=\"nue\">${game.i18n.localize(\"DICESONICE.WelcomeTitle\")}</h3>\n <p class=\"nue\">${game.i18n.localize(\"DICESONICE.WelcomeMessage1\")}</p>\n <p class=\"nue\">${game.i18n.localize(\"DICESONICE.WelcomeMessage2\")}</p>\n <p>\n <button type=\"button\" class=\"dice-so-nice-btn-settings\" data-key=\"dice-so-nice.dice-so-nice\">\n <i class=\"fas fa-dice-d20\"></i> ${game.i18n.localize(\"DICESONICE.configTitle\")}\n </button>\n </p>\n <p class=\"nue\">${game.i18n.localize(\"DICESONICE.WelcomeMessage3\")}</p>\n <p class=\"nue\">${game.i18n.localize(\"DICESONICE.WelcomeMessageTour\")}</p>\n <p>\n <button type=\"button\" class=\"dice-so-nice-btn-tour\" data-tour=\"dice-so-nice-tour\">\n <i class=\"fas fa-hiking\"></i> ${game.i18n.localize(\"DICESONICE.WelcomeMessageTourBtn\")}\n </button>\n </p>\n <p class=\"nue\">${game.i18n.localize(\"DICESONICE.WelcomeMessage4\")}</p>\n <footer class=\"nue\">${game.i18n.localize(\"NUE.FirstLaunchHint\")}</footer>\n </div>\n `];\n const chatData = content.map(c => {\n return {\n whisper: [game.user.id],\n speaker: { alias: \"Dice So Nice!\" },\n flags: { core: { canPopout: true } },\n content: c\n };\n });\n ChatMessage.implementation.createDocuments(chatData);\n }\n game.user.setFlag(\"dice-so-nice\", \"welcomeMessageShown\", true);\n }\n }\n\n /**\n * Register the tours to the Tour Manager\n */\n _registerTours() {\n game.tours.register(\"dice-so-nice\", \"dice-so-nice-tour\", new DiceTourMain());\n }\n\n /**\n * Check if 3D simulation is enabled from the settings.\n */\n isEnabled() {\n let combatEnabled = (!game.combat || !game.combat.started) || (game.combat && game.combat.started && !game.settings.get(\"dice-so-nice\", \"disabledDuringCombat\"));\n return Dice3D.CONFIG().enabled && combatEnabled;\n }\n\n /**\n * Update the DiceBox with fresh new settgins.\n *\n * @param settings\n */\n update(settings) {\n this.box.update(settings);\n }\n\n /**\n * Parse, sort and add the dice animation to the queue for a chat message and an array of Roll\n * Used internally by the message Hooks. Not meant to be used outside of the module.\n * Please use the showForRoll method instead.\n * @param {ChatMessage} chatMessage \n * @param {Array<Roll>} rolls \n */\n renderRolls(chatMessage, rolls) {\n const showMessage = () => {\n delete chatMessage._dice3danimating;\n\n window.ui.chat.element.find(`.message[data-message-id=\"${chatMessage.id}\"]`).removeClass(\"dsn-hide\").find(\".dice-roll\").removeClass(\"dsn-hide\");\n if (window.ui.sidebar.popouts.chat)\n window.ui.sidebar.popouts.chat.element.find(`.message[data-message-id=\"${chatMessage.id}\"]`).removeClass(\"dsn-hide\").find(\".dice-roll\").removeClass(\"dsn-hide\");\n\n Hooks.callAll(\"diceSoNiceRollComplete\", chatMessage.id);\n\n window.ui.chat.scrollBottom({ popout: true });\n }\n\n if (game.view == \"stream\" && !game.modules.get(\"0streamutils\")?.active) {\n setTimeout(showMessage, 2500, chatMessage);\n } else {\n //1- We create a list of all 3D rolls, ordered ASC\n //2- We create a Roll object with the correct formula and results\n //3- We queue the showForRoll calls and then show the message\n let orderedDiceList = [[]];\n rolls.forEach(roll => {\n roll.dice.forEach(diceTerm => {\n let index = 0;\n if (!game.settings.get(\"dice-so-nice\", \"enabledSimultaneousRollForMessage\") && diceTerm.options.hasOwnProperty(\"rollOrder\")) {\n index = diceTerm.options.rollOrder;\n if (orderedDiceList[index] == null) {\n orderedDiceList[index] = [];\n }\n }\n orderedDiceList[index].push(diceTerm);\n });\n });\n orderedDiceList = orderedDiceList.filter(el => el != null);\n\n let rollList = [];\n const plus = new OperatorTerm({ operator: \"+\" }).evaluate();\n orderedDiceList.forEach(dice => {\n //add a \"plus\" between each term\n if (Array.isArray(dice) && dice.length) {\n let termList = [...dice].map((e, i) => i < dice.length - 1 ? [e, plus] : [e]).reduce((a, b) => a.concat(b));\n //We use the Roll class registered in the CONFIG constant in case the system overwrites it (eg: HeXXen)\n rollList.push(CONFIG.Dice.rolls[0].fromTerms(termList));\n }\n });\n\n //call each promise one after the other, then call the showMessage function\n const recursShowForRoll = (rollList, index) => {\n this.showForRoll(rollList[index], chatMessage.user, false, null, false, chatMessage.id, chatMessage.speaker).then(() => {\n index++;\n if (rollList[index] != null)\n recursShowForRoll(rollList, index);\n else\n showMessage();\n });\n };\n\n recursShowForRoll(rollList, 0);\n }\n }\n\n /**\n * Show the 3D Dice animation for the Roll made by the User.\n *\n * @param roll an instance of Roll class to show 3D dice animation.\n * @param user the user who made the roll (game.user by default).\n * @param synchronize if the animation needs to be sent and played for each players (true/false).\n * @param users list of users or userId who can see the roll, leave it empty if everyone can see.\n * @param blind if the roll is blind for the current user\n * @param messageID ChatMessage related to this roll (default: null)\n * @param speaker Object based on the ChatSpeakerData data schema related to this roll. Useful to fully support DsN settings like \"hide npc rolls\". (Default: null)\n * @returns {Promise<boolean>} when resolved true if the animation was displayed, false if not.\n */\n showForRoll(roll, user = game.user, synchronize, users = null, blind, messageID = null, speaker = null) {\n let context = {\n roll: roll,\n user: user,\n users: users,\n blind: blind\n };\n if (speaker) {\n let actor = game.actors.get(speaker.actor);\n const isNpc = actor ? actor.type === 'npc' : false;\n if (isNpc && game.settings.get(\"dice-so-nice\", \"hideNpcRolls\")) {\n return Promise.resolve(false);\n }\n }\n let chatMessage = game.messages.get(messageID);\n if (chatMessage) {\n if (chatMessage.whisper.length > 0)\n context.roll.secret = true;\n if (!chatMessage.isContentVisible)\n context.roll.ghost = true;\n }\n\n\n Hooks.callAll(\"diceSoNiceRollStart\", messageID, context);\n //We allow the hook to modify the roll to be shown without altering the original roll reference\n //This is useful for example to show a different roll than the one made by the user without relying on the manual showForRoll method\n let hookedRoll = context.dsnRoll || context.roll;\n let notation = new DiceNotation(hookedRoll, Dice3D.ALL_CONFIG(user));\n return this.show(notation, context.user, synchronize, context.users, context.blind);\n }\n\n /**\n * Show the 3D Dice animation based on data configuration made by the User.\n *\n * @param data data containing the dice info.\n * @param user the user who made the roll (game.user by default).\n * @param synchronize\n * @param users list of users or userId who can see the roll, leave it empty if everyone can see.\n * @param blind if the roll is blind for the current user\n * @returns {Promise<boolean>} when resolved true if the animation was displayed, false if not.\n */\n show(data, user = game.user, synchronize = false, users = null, blind) {\n return new Promise((resolve, reject) => {\n\n if (!data.throws) throw new Error(\"Roll data should be not null\");\n\n if (!data.throws.length || !this.isEnabled()) {\n resolve(false);\n } else {\n\n if (synchronize) {\n users = users && users.length > 0 ? (users[0]?.id ? users.map(user => user.id) : users) : users;\n game.socket.emit(\"module.dice-so-nice\", { type: \"show\", data: data, user: user.id, users: users });\n }\n\n if (!blind) {\n if (document.hidden) {\n this.hiddenAnimationQueue.push({\n data: data,\n config: Dice3D.ALL_CUSTOMIZATION(user, this.DiceFactory),\n timestamp: (new Date()).getTime(),\n resolve: resolve\n });\n } else {\n this._showAnimation(data, Dice3D.ALL_CUSTOMIZATION(user, this.DiceFactory)).then(displayed => {\n resolve(displayed);\n });\n }\n } else {\n resolve(false);\n }\n }\n if (game.settings.get(\"dice-so-nice\", \"immediatelyDisplayChatMessages\")) {\n resolve();\n }\n });\n }\n\n /**\n * Change the default value of the showExtraDice settings\n * @param {Boolean} show \n */\n showExtraDiceByDefault(show = true) {\n this.defaultShowExtraDice = show;\n }\n\n /**\n * Helper function to detect the end of a 3D animation for a message\n * @param {ChatMessage.ID} targetMessageId \n * @returns Promise<boolean>\n */\n waitFor3DAnimationByMessageID(targetMessageId) {\n function buildHook(resolve) {\n Hooks.once('diceSoNiceRollComplete', (messageId) => {\n if (targetMessageId === messageId)\n resolve(true);\n else\n buildHook(resolve)\n });\n }\n return new Promise((resolve, reject) => {\n if (game.dice3d && Dice3D.CONFIG().enabled && !game.settings.get(\"dice-so-nice\", \"immediatelyDisplayChatMessages\")) {\n buildHook(resolve);\n } else {\n resolve(true);\n }\n });\n }\n\n\n /**\n *\n * @param formula\n * @param results\n * @param dsnConfig\n * @returns {Promise<boolean>}\n * @private\n */\n _showAnimation(notation, dsnConfig) {\n notation.dsnConfig = dsnConfig;\n return new Promise((resolve, reject) => {\n this.nextAnimation.addItem({\n params: notation,\n resolve: resolve\n });\n });\n }\n\n _nextAnimationHandler() {\n let timing = game.settings.get(\"dice-so-nice\", \"enabledSimultaneousRolls\") ? 400 : 0;\n this.nextAnimation = new Accumulator(timing, (items) => {\n let commands = DiceNotation.mergeQueuedRollCommands(items);\n if (this.isEnabled() && this.queue.length < 10) {\n let count = commands.length;\n commands.forEach(aThrow => {\n this.queue.push(() => {\n this._beforeShow();\n this.box.start_throw(aThrow, () => {\n if (!--count) {\n for (let item of items)\n item.resolve(true);\n this._afterShow();\n }\n }\n );\n });\n });\n } else {\n for (let item of items)\n item.resolve(false);\n }\n });\n }\n\n /**\n *\n * @private\n */\n _beforeShow() {\n if (this.timeoutHandle) {\n clearTimeout(this.timeoutHandle);\n }\n this.canvas.stop(true);\n this.canvas.show();\n }\n\n /**\n *\n * @private\n */\n _afterShow() {\n if (Dice3D.CONFIG().hideAfterRoll) {\n if (DiceSFXManager.renderQueue.length) {\n clearTimeout(this.timeoutHandle);\n return;\n } else {\n this.timeoutHandle = setTimeout(() => {\n if (!this.box.rolling) {\n if (Dice3D.CONFIG().hideFX === 'none') {\n this.canvas.hide();\n this.box.clearAll();\n }\n if (Dice3D.CONFIG().hideFX === 'fadeOut') {\n this.canvas.fadeOut({\n duration: 1000,\n complete: () => {\n this.box.clearAll();\n },\n fail: () => {\n this.canvas.fadeIn(0);\n }\n });\n }\n }\n }, Dice3D.CONFIG().timeBeforeHide);\n }\n }\n }\n}","import { Dice3D } from './Dice3D.js';\nimport { DiceBox } from './DiceBox.js';\nimport { DiceSFXManager } from './DiceSFXManager.js';\nimport { Utils } from './Utils.js';\nimport { DiceNotation } from './DiceNotation.js';\nimport { DiceColors, DICE_SCALE } from './DiceColors.js';\n/**\n * Form application to configure settings of the 3D Dice.\n */\nexport class DiceConfig extends FormApplication {\n\n static get defaultOptions() {\n return foundry.utils.mergeObject(super.defaultOptions, {\n title: game.i18n.localize(\"DICESONICE.configTitle\"),\n id: \"dice-config\",\n template: \"modules/dice-so-nice/templates/dice-config.html\",\n width: 650,\n height: \"auto\",\n closeOnSubmit: true,\n tabs: [\n { navSelector: \".tabs\", contentSelector: \"#config-tabs\", initial: \"general\" },\n { navSelector: \".dsn-appearance-tabs\", contentSelector: \"#dsn-appearance-content\", initial: \"global\" }\n ]\n })\n }\n\n async getData(options) {\n let data = foundry.utils.mergeObject({\n fxList: Utils.localize({\n \"none\": \"DICESONICE.None\",\n \"fadeOut\": \"DICESONICE.FadeOut\"\n }),\n speedList: Utils.localize({\n \"1\": \"DICESONICE.NormalSpeed\",\n \"2\": \"DICESONICE.2xSpeed\",\n \"3\": \"DICESONICE.3xSpeed\"\n }),\n textureList: Utils.prepareTextureList(),\n materialList: Utils.localize({\n \"auto\": \"DICESONICE.MaterialAuto\",\n \"chrome\": \"DICESONICE.MaterialChrome\",\n \"glass\": \"DICESONICE.MaterialGlass\",\n \"iridescent\": \"DICESONICE.MaterialIridescent\",\n \"metal\": \"DICESONICE.MaterialMetal\",\n \"plastic\": \"DICESONICE.MaterialPlastic\",\n \"pristine\": \"DICESONICE.MaterialPristine\",\n \"stone\": \"DICESONICE.MaterialStone\",\n \"wood\": \"DICESONICE.MaterialWood\"\n }),\n fontList: Utils.prepareFontList(),\n colorsetList: Utils.prepareColorsetList(),\n imageQualityList: Utils.localize({\n \"low\": \"DICESONICE.Low\",\n \"medium\": \"DICESONICE.Medium\",\n \"high\": \"DICESONICE.High\",\n \"custom\": \"DICESONICE.Custom\"\n }),\n shadowQualityList: Utils.localize({\n \"none\": \"DICESONICE.None\",\n \"low\": \"DICESONICE.Low\",\n \"high\": \"DICESONICE.High\"\n }),\n antialiasingList: Utils.localize({\n \"none\": \"DICESONICE.None\",\n \"smaa\": \"DICESONICE.SMAA\",\n \"msaa\": \"DICESONICE.MSAA\"\n }),\n systemList: Utils.prepareSystemList(),\n soundsSurfaceList: Utils.localize({\n \"felt\": \"DICESONICE.SurfaceFelt\",\n \"wood_table\": \"DICESONICE.SurfaceWoodTable\",\n \"wood_tray\": \"DICESONICE.SurfaceWoodTray\",\n \"metal\": \"DICESONICE.SurfaceMetal\"\n }),\n canvasZIndexList: Utils.localize({\n \"over\": \"DICESONICE.CanvasZIndexOver\",\n \"under\": \"DICESONICE.CanvasZIndexUnder\",\n }),\n throwingForceList: Utils.localize({\n \"weak\": \"DICESONICE.ThrowingForceWeak\",\n \"medium\": \"DICESONICE.ThrowingForceMedium\",\n \"strong\": \"DICESONICE.ThrowingForceStrong\"\n })\n },\n this.reset ? Dice3D.ALL_DEFAULT_OPTIONS() : Dice3D.ALL_CONFIG()\n );\n delete data.sfxLine;\n\n //remove MSAA if not supported\n if (game.canvas.app.renderer.context.webGLVersion<2){\n delete data.antialiasingList.msaa;\n }\n\n //fix corupted save from #139\n if (data.specialEffects) {\n for (let [key, value] of Object.entries(data.specialEffects)) {\n if (Array.isArray(value.diceType) || Array.isArray(value.onResult) || Array.isArray(value.specialEffect))\n delete data.specialEffects[key];\n }\n }\n\n this.canvas = $('<div id=\"dice-configuration-canvas\"></div>')[0];\n let config = foundry.utils.mergeObject(\n this.reset ? Dice3D.ALL_DEFAULT_OPTIONS() : Dice3D.ALL_CONFIG(),\n { dimensions: { w: 634, h: 245 }, autoscale: false, scale: 60, boxType: \"showcase\" }\n );\n\n this.box = new DiceBox(this.canvas, game.dice3d.box.dicefactory, config);\n await this.box.initialize();\n if (!game.user.getFlag(\"dice-so-nice\", \"appearance\")) {\n if (this.box.dicefactory.preferredSystem != \"standard\")\n config.appearance.global.system = this.box.dicefactory.preferredSystem;\n if (this.box.dicefactory.preferredColorset != \"standard\")\n config.appearance.global.colorset = this.box.dicefactory.preferredColorset;\n }\n this.box.showcase(config);\n\n this.navOrder = {};\n let triggerTypeList = [{ id: \"\", name: \"\" }];\n this.possibleResultList = {};\n let i = 0;\n this.box.diceList.forEach((el) => {\n this.navOrder[el.userData] = i++;\n triggerTypeList.push({ id: el.userData, name: el.userData });\n this.possibleResultList[el.userData] = [];\n let preset = this.box.dicefactory.systems.standard.dice.find(dice => dice.type == el.userData);\n let termClass = Object.values(CONFIG.Dice.terms).find(term => term.name == preset.term) || Die;\n let term = new termClass({});\n\n if(el.userData == \"d100\"){\n for(let i = 1; i<=100;i++){\n let label = term.getResultLabel({ result: i });\n let option = { id: i + \"\", name: label };\n this.possibleResultList[el.userData].push(option);\n }\n } else {\n preset.values.forEach((value) => {\n let label = term.getResultLabel({ result: value });\n let option = { id: value + \"\", name: label };\n this.possibleResultList[el.userData].push(option);\n });\n }\n\n //add special triggers, like \"keep hihest\" (kh)\n this.possibleResultList[el.userData].push({id: \"kh\", name: \"Keep Highest\"});\n this.possibleResultList[el.userData].push({id: \"kl\", name: \"Keep Lowest\"});\n });\n\n let specialEffectsList = [];\n let specialEffectsPromises = [];\n let specialEffects = Dice3D.SFX();\n if (this.reset)\n specialEffects = [];\n this.triggerTypeList = [...triggerTypeList, ...DiceSFXManager.EXTRA_TRIGGER_TYPE];\n foundry.utils.mergeObject(this.possibleResultList, DiceSFXManager.EXTRA_TRIGGER_RESULTS,{performDeletions:true});\n\n //Filter out the SFX that are not registered\n if (specialEffects) {\n let registeredTriggerTypes = this.triggerTypeList.map(trigger => trigger.id);\n specialEffects = specialEffects.filter(sfx => registeredTriggerTypes.includes(sfx.diceType));\n }\n\n if (specialEffects) {\n specialEffects.forEach((sfx, index) => {\n let sfxClass = DiceSFXManager.SFX_MODE_CLASS[sfx.specialEffect];\n let dialogContent = sfxClass.getDialogContent(sfx, index);\n let hdbsTemplate = Handlebars.compile(dialogContent.content);\n\n specialEffectsPromises.push(renderTemplate(\"modules/dice-so-nice/templates/partial-sfx.html\", {\n id: index,\n diceType: sfx.diceType,\n onResult: sfx.onResult,\n specialEffect: sfx.specialEffect,\n specialEffectsMode: DiceSFXManager.SFX_MODE_LIST,\n triggerTypeList: this.triggerTypeList,\n possibleResultList: this.possibleResultList[sfx.diceType],\n options: hdbsTemplate(dialogContent.data)\n }).then((html) => {\n specialEffectsList.push(html);\n }));\n });\n await Promise.all(specialEffectsPromises);\n }\n data.specialEffectsList = specialEffectsList.join(\"\");\n\n let tabsList = [];\n for (let scope in data.appearance) {\n if (data.appearance.hasOwnProperty(scope)) {\n tabsList.push(scope);\n if (scope != \"global\") {\n if (!data.appearance[scope].labelColor)\n data.appearance[scope].labelColor = data.appearance.global.labelColor;\n if (!data.appearance[scope].diceColor)\n data.appearance[scope].diceColor = data.appearance.global.diceColor;\n if (!data.appearance[scope].outlineColor)\n data.appearance[scope].outlineColor = data.appearance.global.outlineColor;\n if (!data.appearance[scope].edgeColor)\n data.appearance[scope].edgeColor = data.appearance.global.edgeColor;\n }\n }\n }\n\n let tabsAppearance = [];\n let tabsPromises = [];\n data.navAppearance = {};\n tabsList.forEach((diceType) => {\n tabsPromises.push(renderTemplate(\"modules/dice-so-nice/templates/partial-appearance.html\", {\n dicetype: diceType,\n appearance: data.appearance[diceType],\n systemList: data.systemList,\n colorsetList: data.colorsetList,\n textureList: data.textureList,\n materialList: data.materialList,\n fontList: data.fontList\n }).then((html) => {\n tabsAppearance.push(html);\n }));\n if (diceType != \"global\")\n data.navAppearance[diceType] = diceType.toUpperCase();\n });\n await Promise.all(tabsPromises);\n\n if (tabsAppearance.length > 1)\n data.displayHint = \"style='display:none;'\";\n else\n data.displayHint = '';\n\n data.tabsAppearance = tabsAppearance.join(\"\");\n this.lastActiveAppearanceTab = \"global\";\n\n this.initializationData = data;\n this.currentGlobalAppearance = data.appearance.global;\n this.sfxDialogList = [];\n\n const templateSelect2 = (result) => {\n\n if (result.element) {\n let label = this.possibleResultList[result.element.parentElement.dataset.sfxResultDicetype].find(el => el.id == result.text).name;\n if (label != result.text)\n return `${label} (${result.text})`;\n else\n return result.text;\n } else {\n return result.text;\n }\n };\n\n this.select2Options = {\n dropdownCssClass: \"dice-so-nice\",\n escapeMarkup: function (text) { return text; },\n dropdownParent: \"form.dice-so-nice\",\n templateResult: templateSelect2,\n templateSelection: templateSelect2,\n width: \"306px\"\n }\n\n return data;\n }\n\n activateListeners(html) {\n super.activateListeners(html);\n\n $(html).find(\"#dice-configuration-canvas-container\").append(this.canvas);\n\n\n this.toggleHideAfterRoll();\n this.toggleAutoScale();\n this.toggleCustomization();\n this.filterSystems();\n this.setPreferredOptions();\n\n select2dsn.call($(this.element).find(\"[data-sfx-result]\"), this.select2Options);\n\n if (!this.reset) {\n $(this.element).on(\"change\", \"[data-showExtraDice]\", (ev) => {\n this.onApply(ev);\n });\n\n $(this.element).on(\"change\", \"[data-hideAfterRoll]\", (ev) => {\n this.toggleHideAfterRoll(ev);\n });\n\n $(this.element).on(\"change\", \"[data-sounds]\", (ev) => {\n this.toggleSounds(ev);\n });\n\n $(this.element).on(\"change\", \"[data-autoscale]\", (ev) => {\n this.toggleAutoScale(ev);\n });\n\n $(this.element).on(\"change\", \"[data-colorset]\", (ev) => {\n this.toggleCustomColors($(ev.target).data(\"dicetype\"));\n });\n\n $(this.element).on(\"change\", \"[data-system]\", (ev) => {\n this.toggleCustomization($(ev.target).data(\"dicetype\"));\n });\n\n $(this.element).on(\"change\", \"input,select\", (ev) => {\n this.onApply(ev);\n });\n\n $(this.element).on(\"click\", \"[data-reset]\", (ev) => {\n this.onReset(ev);\n });\n\n $(this.element).on(\"click\", \"[data-cancel]\", (ev) => {\n this.close();\n });\n\n $(this.element).on(\"click\", \"[data-close-tab]\", (ev) => {\n let diceType = $(ev.target).parent().data(\"tab\");\n this.closeAppearanceTab(diceType);\n });\n\n $(this.element).on(\"click\", \"[data-test]\", (ev) => {\n let config = this.getShowcaseAppearance();\n let denominationList = [];\n this.box.diceList.forEach((el) => {\n //the d100 will roll the d10 so we remove the d10 from the list\n if (el.userData != \"d10\")\n denominationList.push(el.userData);\n });\n let roll = new Roll(denominationList.join(\"+\")).evaluate({async:true}).then((roll) =>{\n let data = new DiceNotation(roll);\n\n let specialEffects = this.getShowcaseSFX();\n let customization = foundry.utils.mergeObject({ appearance: config.appearance }, { specialEffects: specialEffects },{performDeletions:true});\n\n game.dice3d._showAnimation(data, customization);\n });\n });\n\n $(this.element).on(\"click\", \"[data-sfx-create]\", (ev) => {\n let ID = $(this.element).find(\".sfx-line\").length;\n let firstSFX = Object.keys(DiceSFXManager.SFX_MODE_LIST)[0];\n let sfxClass = DiceSFXManager.SFX_MODE_CLASS[firstSFX];\n let dialogContent = sfxClass.getDialogContent({}, ID);\n let hdbsTemplate = Handlebars.compile(dialogContent.content);\n renderTemplate(\"modules/dice-so-nice/templates/partial-sfx.html\", {\n id: ID,\n diceType: \"\",\n onResult: [],\n specialEffect: \"\",\n specialEffectsMode: DiceSFXManager.SFX_MODE_LIST,\n triggerTypeList: this.triggerTypeList,\n possibleResultList: [],\n options: hdbsTemplate(dialogContent.data)\n }).then((html) => {\n $(this.element).find(\"#sfxs-list\").append(html);\n select2dsn.call($(\"[data-sfx-result]\"), this.select2Options);\n this.setPosition();\n });\n });\n\n $(this.element).on(\"click\", \"[data-sfx-delete]\", (ev) => {\n $(ev.target).parents(\".sfx-line\").remove();\n $(this.element).find(\".sfx-line\").each(function (index) {\n $(this).find(\"input, select\").each(function () {\n let name = $(this).attr(\"name\");\n $(this).attr(\"name\", name.replace(/(\\w+\\[)(\\d+)(\\]\\[\\w+\\])/, \"$1\" + index + \"$3\"));\n });\n });\n this.setPosition();\n });\n\n $(this.element).on(\"click\", \"[data-sfx-options]\", (ev) => {\n let sfxLineOptions = $(ev.target).parents(\".sfx-line\").find(\"[data-sfx-hidden-options]\");\n\n if (sfxLineOptions.length < 1)\n return;\n\n let d = new Dialog({\n title: game.i18n.localize(\"DICESONICE.Options\"),\n content: `<form autocomplete=\"off\" onsubmit=\"event.preventDefault();\"></form>`,\n buttons: {\n ok: {\n icon: '<i class=\"fas fa-check-circle\"></i>',\n label: 'OK'\n }\n },\n default: \"ok\",\n render: (html) => {\n sfxLineOptions.detach().appendTo($(html).find(\"form\"));\n },\n close: (html) => {\n $(html).find(\"[data-sfx-hidden-options]\").detach().appendTo($(ev.target).parents(\".sfx-line\").find(\".sfx-hidden\"));\n this.sfxDialogList = this.sfxDialogList.filter(dialog => dialog.appId != d.appId);\n }\n });\n d.render(true);\n this.sfxDialogList.push(d);\n });\n\n $(this.element).on(\"change\", \"[data-sfx-dicetype]\", (ev) => {\n let dicetype = $(ev.target).val();\n let optionHTML = $([]);\n if (dicetype != \"\") {\n this.possibleResultList[dicetype].forEach(opt => {\n let frag = $(\"<option></option>\");\n frag.html(opt.id);\n frag.attr(\"value\", opt.id);\n optionHTML = optionHTML.add(frag);\n });\n $(ev.target).parents(\".sfx-line\").find(\"[data-sfx-result]\").html(optionHTML).attr(\"data-sfx-result-dicetype\", dicetype).trigger(\"change\");\n } else {\n $(ev.target).parents(\".sfx-line\").find(\"[data-sfx-result]\").empty().trigger(\"change\");\n }\n });\n\n $(this.element).on(\"change\", \"[data-sfx-result]\", (ev) => {\n this.setPosition();\n });\n\n $(this.element).on(\"change\", \"[data-sfx-specialeffect]\", (ev) => {\n this.sfxDialogList.forEach((dialog) => {\n dialog.close();\n });\n this.sfxDialogList = [];\n let sfxLine = $(ev.target).parents(\".sfx-line\");\n\n let ID = sfxLine.prevAll(\".sfx-line\").length;\n let sfxClass = DiceSFXManager.SFX_MODE_CLASS[$(ev.target).val()];\n let dialogContent = sfxClass.getDialogContent({}, ID);\n let hdbsTemplate = Handlebars.compile(dialogContent.content);\n\n sfxLine.find(\".sfx-hidden [data-sfx-hidden-options]\").html(hdbsTemplate(dialogContent.data));\n for (let fp of sfxLine.find(\".sfx-hidden [data-sfx-hidden-options] button.file-picker\")) {\n fp.onclick = this._activateFilePicker.bind(this);\n }\n });\n\n /**\n * Save As\n */\n $(this.element).on(\"click\", \"[data-saveas]\", async (ev) => {\n let saves = game.user.getFlag(\"dice-so-nice\", \"saves\");\n let saveList = new Map();\n if (saves)\n saveList = new Map(Object.entries(saves));\n\n let dialogSaveAs = new Dialog({\n title: game.i18n.localize(\"DICESONICE.SaveAs\"),\n width: 550,\n content: await renderTemplate(\"modules/dice-so-nice/templates/dialog-saveas.html\",\n {\n saveList: saveList.keys()\n }),\n buttons: {},\n render: html => {\n if (saveList.size) {\n $(html).on(\"click\", \"[data-overwrite]\", (ev) => {\n let name = $(html).find(\"[data-save-list]\").val();\n this.actionSaveAs(name);\n dialogSaveAs.close();\n });\n\n $(html).on(\"click\", \"[data-delete]\", async (ev) => {\n let name = $(html).find(\"[data-save-list]\").val();\n await this.actionDeleteSave(name);\n saveList.delete(name);\n $(html).find(\"[data-save-list] option:selected\").remove();\n if (!saveList.size) {\n $(html).find(\"[data-overwrite]\").prop(\"disabled\", true);\n $(html).find(\"[data-delete]\").prop(\"disabled\", true);\n }\n });\n\n } else {\n $(html).find(\"[data-overwrite]\").prop(\"disabled\", true);\n $(html).find(\"[data-delete]\").prop(\"disabled\", true);\n }\n\n $(html).on(\"click\", \"[data-add-new]\", (ev) => {\n let name = $(html).find(\"[data-save-name]\").val();\n if (name) {\n if (saveList.has(name)) {\n ui.notifications.error(game.i18n.localize(\"DICESONICE.SaveAsErrorAlreadyExist\"));\n } else {\n this.actionSaveAs(name);\n dialogSaveAs.close();\n }\n }\n else\n ui.notifications.error(game.i18n.localize(\"DICESONICE.SaveAsErrorName\"));\n });\n }\n }, {\n width: 450,\n classes: [\"dice-so-nice\"]\n }).render(true);\n });\n\n /**\n * Load\n */\n $(this.element).on(\"click\", \"[data-load]\", async (ev) => {\n let saves = game.user.getFlag(\"dice-so-nice\", \"saves\");\n let saveList = [];\n if (saves)\n saveList = new Map(Object.entries(saves));\n\n new Dialog({\n title: game.i18n.localize(\"DICESONICE.Load\"),\n content: await renderTemplate(\"modules/dice-so-nice/templates/dialog-load.html\",\n {\n saveList: saveList.keys()\n }),\n buttons: {\n load: {\n icon: '<i class=\"fas fa-box-open\"></i>',\n label: game.i18n.localize(\"DICESONICE.Load\"),\n callback: async html => {\n let name = $(html).find(\"[data-save-list]\").val();\n await this.actionLoadSave(name);\n //Close Dice Settings\n this.close();\n }\n },\n no: {\n icon: '<i class=\"fas fa-ban\"></i>',\n label: game.i18n.localize(\"DICESONICE.Cancel\")\n }\n },\n render: html => {\n if (!saveList.size)\n $(html).find('[data-button=\"load\"]').prop(\"disabled\", true);\n },\n default: \"no\"\n }, {\n width: 550\n }).render(true);\n });\n\n\n /**\n * Import\n */\n $(this.element).on(\"click\", \"[data-import]\", async (ev) => {\n new Dialog({\n title: game.i18n.localize(\"DICESONICE.Import\"),\n content: await renderTemplate(\"modules/dice-so-nice/templates/dialog-import.html\"),\n buttons: {\n import: {\n icon: '<i class=\"fas fa-file-import\"></i>',\n label: game.i18n.localize(\"DICESONICE.Import\"),\n callback: html => {\n const form = html.find(\"form\")[0];\n if (!form.data.files.length) return ui.notifications.error(game.i18n.localize(\"DICESONICE.ImportNoFile\"));\n readTextFromFile(form.data.files[0]).then(async json => {\n await this.actionImportFromJSON(json);\n this.close();\n });\n }\n },\n no: {\n icon: '<i class=\"fas fa-ban\"></i>',\n label: \"Cancel\"\n }\n },\n default: \"import\"\n }, {\n width: 400\n }).render(true);\n });\n\n $(this.element).on(\"click\", \"[data-export]\", async (ev) => {\n const filename = `fvtt-dicesonice-${Date.now()}.json`;\n this.actionExportToJSON().then((json) => {\n saveDataToFile(json, \"text/json\", filename);\n });\n });\n\n $(this.element).on(\"click\", \"[data-exportSFX]\", async (ev) => {\n const filename = `fvtt-dicesonice-SFX-${Date.now()}.json`;\n this.actionExportSFXToJSON().then((json) => {\n saveDataToFile(json, \"text/json\", filename);\n });\n });\n\n $(this.element).on(\"click\", \"#dice-configuration-canvas\", (event) => {\n let rect = event.target.getBoundingClientRect();\n let x = ((event.clientX - rect.left) / rect.width) * 2 - 1;\n if (x > 1)\n x = 1;\n let y = - ((event.clientY - rect.top) / rect.height) * 2 + 1;\n let pos = { x: x, y: y };\n let dice = this.box.findShowcaseDie(pos);\n if (dice) {\n let diceType = this.box.findRootObject(dice.object).userData;\n if (!game.user.getFlag(\"dice-so-nice\", \"appearance\") && (this.box.dicefactory.preferredSystem != \"standard\" || this.box.dicefactory.preferredColorset != \"custom\"))\n this.getShowcaseAppearance();\n if ($(this.element).find(`.dsn-appearance-tabs [data-tab=\"${diceType}\"]`).length) {\n this.activateAppearanceTab(diceType);\n } else {\n $(this.element).find(\".dsn-appearance-hint\").hide();\n renderTemplate(\"modules/dice-so-nice/templates/partial-appearance.html\", {\n dicetype: diceType,\n appearance: this.currentGlobalAppearance,\n systemList: this.initializationData.systemList,\n colorsetList: this.initializationData.colorsetList,\n textureList: this.initializationData.textureList,\n materialList: this.initializationData.materialList,\n fontList: this.initializationData.fontList\n }).then((html) => {\n let tabName = diceType.toUpperCase();\n\n let insertBefore = null;\n //let's find where to insert the tab so it keeps the same order as the dice list\n $(this.element).find(\".dsn-appearance-tabs .item\").each((index, el) => {\n if (this.navOrder[$(el).data(\"tab\")] >= this.navOrder[diceType]) {\n insertBefore = $(el).data(\"tab\");\n return false;\n }\n });\n let htmlNavString = `<span class=\"item\" data-group=\"dsn-dice\" data-tab=\"${diceType}\">${tabName} <i class=\"fas fa-times\" data-close-tab></i></span>`;\n if (insertBefore) {\n $(html).insertBefore($(this.element).find(`.tabAppearance[data-tab=\"${insertBefore}\"]`));\n $(htmlNavString).insertBefore($(this.element).find(`.dsn-appearance-tabs .item[data-tab=\"${insertBefore}\"]`));\n } else {\n $(this.element).find(\"#dsn-appearance-content\").append(html);\n $(this.element).find(\".dsn-appearance-tabs\").append(htmlNavString);\n }\n this.activateAppearanceTab(diceType);\n this.toggleCustomization(diceType);\n this.filterSystems(diceType);\n });\n }\n }\n });\n\n $(this.element).on(\"change\", \"[data-imageQuality]\", (event) => {\n let quality = {\n bumpMapping: true,\n shadowQuality: \"high\",\n glow: true,\n antialiasing: game.canvas.app.renderer.context.webGLVersion===2 ?\"msaa\":\"smaa\",\n useHighDPI: true\n };\n switch(event.target.value) {\n case \"low\":\n quality.bumpMapping = false;\n quality.shadowQuality = \"low\";\n quality.glow = false;\n quality.antialiasing = \"none\";\n quality.useHighDPI = false;\n break;\n case \"medium\":\n quality.bumpMapping = true;\n quality.shadowQuality = \"low\";\n quality.glow = false;\n quality.antialiasing = \"none\";\n quality.useHighDPI = false;\n break;\n case \"high\":\n quality.bumpMapping = true;\n quality.shadowQuality = \"high\";\n quality.glow = true;\n quality.antialiasing = game.canvas.app.renderer.context.webGLVersion===2 ?\"msaa\":\"smaa\";\n quality.useHighDPI = true;\n break;\n }\n $(this.element).find(\"[data-bumpMapping]\").prop(\"checked\", quality.bumpMapping);\n $(this.element).find(\"[data-shadowQuality]\").val(quality.shadowQuality);\n $(this.element).find(\"[data-glow]\").prop(\"checked\", quality.glow);\n $(this.element).find(\"[data-antialiasing]\").val(quality.antialiasing);\n $(this.element).find(\"[data-useHighDPI]\").prop(\"checked\", quality.useHighDPI);\n });\n\n $(this.element).on(\"change\", \"[data-bumpMapping],[data-shadowQuality],[data-glow],[data-antialiasing],[data-useHighDPI]\", (event) => {\n $(this.element).find(\"[data-imageQuality]\").val(\"custom\");\n });\n }\n }\n\n async actionSaveAs(name) {\n await this.submit({\n preventClose: true,\n preventRender: true\n });\n\n Utils.actionSaveAs(name);\n }\n\n async actionDeleteSave(name) {\n await Utils.actionDeleteSave(name);\n }\n\n async actionLoadSave(name) {\n await Utils.actionLoadSave(name);\n }\n\n async actionExportToJSON() {\n\n //save current settings first\n await this.submit({\n preventClose: true,\n preventRender: true\n });\n let data = {\n appearance: game.user.getFlag(\"dice-so-nice\", \"appearance\"),\n sfxList: game.user.getFlag(\"dice-so-nice\", \"sfxList\"),\n settings: game.user.getFlag(\"dice-so-nice\", \"settings\")\n };\n\n return JSON.stringify(data, null, 2);\n }\n\n async actionExportSFXToJSON() {\n\n //save current settings first\n await this.submit({\n preventClose: true,\n preventRender: true\n });\n let data = {\n sfxList: game.user.getFlag(\"dice-so-nice\", \"sfxList\")\n };\n\n return JSON.stringify(data, null, 2);\n }\n\n async actionImportFromJSON(json) {\n let data = JSON.parse(json);\n\n if (data.appearance) {\n await game.user.unsetFlag(\"dice-so-nice\", \"appearance\");\n await game.user.setFlag(\"dice-so-nice\", \"appearance\", data.appearance);\n }\n if (data.sfxList) {\n await game.user.unsetFlag(\"dice-so-nice\", \"sfxList\");\n await game.user.setFlag(\"dice-so-nice\", \"sfxList\", data.sfxList);\n }\n if (data.settings) {\n await game.user.unsetFlag(\"dice-so-nice\", \"settings\");\n await game.user.setFlag(\"dice-so-nice\", \"settings\", data.settings);\n }\n }\n\n activateAppearanceTab(diceType) {\n let tabs = this._tabs[1];\n if (tabs.active != diceType)\n tabs.activate(diceType, { triggerCallback: true });\n }\n\n closeAppearanceTab(diceType) {\n if (diceType == \"global\")\n return;\n let tabs = this._tabs[1];\n if (this._tabs[1].active == diceType)\n tabs.activate(\"global\", { triggerCallback: true });\n\n $(this.element).find(`.tabAppearance[data-tab=\"${diceType}\"]`).remove();\n $(this.element).find(`.dsn-appearance-tabs [data-tab=\"${diceType}\"]`).remove();\n\n this.onApply();\n }\n\n _onChangeTab(event, tabs, active) {\n super._onChangeTab(event, tabs, active);\n if (tabs._contentSelector == \"#dsn-appearance-content\") {\n if (this.lastActiveAppearanceTab != \"global\") {\n let appearanceArray = [];\n $(this.element).find(`.tabAppearance[data-tab=\"global\"],.tabAppearance[data-tab=\"${this.lastActiveAppearanceTab}\"]`).each((index, element) => {\n let obj = {\n labelColor: $(element).find('[data-labelColor]').val(),\n diceColor: $(element).find('[data-diceColor]').val(),\n outlineColor: $(element).find('[data-outlineColor]').val(),\n edgeColor: $(element).find('[data-edgeColor]').val(),\n colorset: $(element).find('[data-colorset]').val(),\n texture: $(element).find('[data-texture]').val(),\n material: $(element).find('[data-material]').val(),\n font: $(element).find('[data-font]').val(),\n system: $(element).find('[data-system]').val(),\n };\n //disabled systems arent returned\n if (obj.system == null) {\n obj.system = this.currentGlobalAppearance.system;\n }\n appearanceArray.push(obj);\n });\n if (appearanceArray.length > 1) {\n let diff = diffObject(appearanceArray[0], appearanceArray[1]);\n if (foundry.utils.isEmpty(diff)) {\n this.closeAppearanceTab(this.lastActiveAppearanceTab)\n }\n }\n }\n this.lastActiveAppearanceTab = active;\n }\n }\n\n toggleHideAfterRoll() {\n let hideAfterRoll = $(this.element).find('[data-hideAfterRoll]')[0].checked;\n $(this.element).find('[data-timeBeforeHide]').prop(\"disabled\", !hideAfterRoll);\n $(this.element).find('[data-hideFX]').prop(\"disabled\", !hideAfterRoll);\n }\n\n toggleSounds() {\n let sounds = $(this.element).find('[data-sounds]')[0].checked;\n $(this.element).find('[data-soundsSurface]').prop(\"disabled\", !sounds);\n $(this.element).find('[data-soundsVolume]').prop(\"disabled\", !sounds);\n //$('.sounds-range-value').css({ 'opacity': !sounds ? 0.4 : 1 });\n }\n\n toggleAutoScale() {\n let autoscale = $(this.element).find('[data-autoscale]')[0].checked;\n $(this.element).find('[data-scale]').prop(\"disabled\", autoscale);\n //$('.scale-range-value').css({ 'opacity': autoscale ? 0.4 : 1 });\n }\n\n toggleCustomColors(dicetype) {\n let scope = $(this.element).find(\".tabAppearance\");\n if (dicetype) {\n scope = scope.filter(`[data-tab=\"${dicetype}\"]`);\n }\n scope.each((index, element) => {\n let colorset = $(element).find('[data-colorset]');\n let disabled = colorset.val() !== 'custom' || colorset.prop(\"disabled\");\n $(element).find('[data-labelColor]').prop(\"disabled\", disabled);\n $(element).find('[data-diceColor]').prop(\"disabled\", disabled);\n $(element).find('[data-outlineColor]').prop(\"disabled\", disabled);\n $(element).find('[data-edgeColor]').prop(\"disabled\", disabled);\n $(element).find('[data-labelColorSelector]').prop(\"disabled\", disabled);\n $(element).find('[data-diceColorSelector]').prop(\"disabled\", disabled);\n $(element).find('[data-outlineColorSelector]').prop(\"disabled\", disabled);\n $(element).find('[data-edgeColorSelector]').prop(\"disabled\", disabled);\n });\n }\n\n toggleCustomization(diceType = null) {\n let container;\n if (diceType) {\n container = $(this.element).find(`.tabAppearance[data-tab=\"${diceType}\"]`);\n } else {\n container = $(this.element).find(`.tabAppearance`);\n }\n\n container.each((index, element) => {\n let diceType = $(element).data(\"tab\");\n if (diceType != \"global\") {\n let system = $(element).find('[data-system]').val();\n let customizationElements = $(element).find('[data-colorset],[data-texture],[data-material],[data-font]');\n if (system != \"standard\") {\n let diceobj = this.box.dicefactory.systems[system].dice.find(obj => obj.type == diceType);\n if (diceobj) {\n let colorsetData = {};\n if (diceobj.colorset) {\n colorsetData = DiceColors.getColorSet(diceobj.colorset);\n }\n customizationElements.each((index, el) => {\n let colorsetForce = false;\n if ($(el).is(\"[data-colorset]\") && !foundry.utils.isEmpty(colorsetData))\n colorsetForce = true;\n else if ($(el).is(\"[data-texture]\") && !foundry.utils.isEmpty(colorsetData) && colorsetData.texture != \"custom\")\n colorsetForce = true;\n else if ($(el).is(\"[data-material]\") && !foundry.utils.isEmpty(colorsetData) && colorsetData.material != \"custom\")\n colorsetForce = true;\n else if ($(el).is(\"[data-font]\") && ((!foundry.utils.isEmpty(colorsetData) && colorsetData.font != \"custom\") || diceobj.font))\n colorsetForce = true;\n $(el).prop(\"disabled\", diceobj.modelFile || colorsetForce);\n });\n }\n } else {\n customizationElements.prop(\"disabled\", false);\n }\n }\n });\n this.toggleCustomColors(diceType);\n }\n\n filterSystems(diceType = null) {\n let container;\n if (diceType) {\n container = $(this.element).find(`.tabAppearance[data-tab=\"${diceType}\"] [data-system]`);\n } else {\n container = $(this.element).find(`.tabAppearance [data-system]`);\n }\n container.each((index, element) => {\n let diceType = $(element).data(\"dicetype\");\n if (diceType != \"global\") {\n $(element).find(\"option\").each((indexOpt, elementOpt) => {\n let model = this.box.dicefactory.systems[\"standard\"].dice.find(obj => obj.type == diceType);\n if (!this.box.dicefactory.systems[$(elementOpt).val()].dice.find(obj => obj.type == diceType || (model && obj.shape == model.shape && obj.values.length == model.values.length)))\n $(elementOpt).attr(\"disabled\", \"disabled\");\n });\n }\n });\n }\n\n setPreferredOptions() {\n if (!game.user.getFlag(\"dice-so-nice\", \"appearance\")) {\n if (this.box.dicefactory.preferredSystem != \"standard\")\n $(this.element).find('.tabAppearance[data-tab=\"global\"] [data-system]').val(this.box.dicefactory.preferredSystem);\n if (this.box.dicefactory.preferredColorset != \"custom\")\n $(this.element).find('.tabAppearance[data-tab=\"global\"] [data-colorset]').val(this.box.dicefactory.preferredColorset);\n }\n }\n\n getShowcaseAppearance() {\n let config = {\n autoscale: false,\n scale: 60,\n shadowQuality: $('[data-shadowQuality]').val(),\n imageQuality: $('[data-imageQuality]').val(),\n antialiasing: $('[data-antialiasing]').val(),\n bumpMapping: $('[data-bumpMapping]').is(':checked'),\n glow: $('[data-glow]').is(':checked'),\n sounds: $('[data-sounds]').is(':checked'),\n throwingForce: $('[data-throwingForce]').val(),\n useHighDPI: $('[data-useHighDPI]').is(':checked'),\n showExtraDice: $('[data-showExtraDice]').is(':checked'),\n muteSoundSecretRolls: $('[data-muteSoundSecretRolls]').is(':checked'),\n enableFlavorColorset: $('[data-enableFlavorColorset]').is(':checked'),\n immersiveDarkness: $('[data-immersiveDarkness]').is(':checked'),\n appearance: {}\n };\n $(this.element).find('.tabAppearance').each((index, element) => {\n config.appearance[$(element).data(\"tab\")] = {\n labelColor: $(element).find('[data-labelColor]').val(),\n diceColor: $(element).find('[data-diceColor]').val(),\n outlineColor: $(element).find('[data-outlineColor]').val(),\n edgeColor: $(element).find('[data-edgeColor]').val(),\n colorset: $(element).find('[data-colorset]').val(),\n texture: $(element).find('[data-texture]').val(),\n material: $(element).find('[data-material]').val(),\n font: $(element).find('[data-font]').val(),\n system: $(element).find('[data-system]').val(),\n };\n });\n this.currentGlobalAppearance = config.appearance.global;\n return config;\n }\n\n //Not used because SFX aren't initialized. Keeping it here for later use.\n getShowcaseSFX() {\n let sfxList = [];\n\n $(this.element).find('.sfx-line').each((index, element) => {\n let sfx = {\n diceType: $(element).find('[data-sfx-dicetype]').val(),\n onResult: $(element).find('[data-sfx-result]').val(),\n specialEffect: $(element).find('[data-sfx-specialeffect]').val(),\n options: {}\n };\n $(element).find(\"[data-sfx-hidden-options]\").find(\"input,select\").each((i, el) => {\n let name = $(el).attr(\"name\").match(/.*\\[(.*)\\]$/)[1];\n if ($(el).attr(\"type\") == \"checkbox\")\n sfx.options[name] = $(el).prop(\"checked\");\n else\n sfx.options[name] = $(el).val();\n });\n if (sfx.diceType && sfx.onResult && sfx.specialEffect)\n sfxList.push(sfx);\n });\n return sfxList;\n }\n\n onApply(event = null) {\n if (event)\n event.preventDefault();\n\n setTimeout(() => {\n let config = this.getShowcaseAppearance();\n this.box.dicefactory.disposeCachedMaterials(\"showcase\");\n this.box.update(config).then(() => {\n this.box.showcase(config);\n });\n }, 100);\n }\n\n onReset() {\n this.reset = true;\n this.render();\n this._tabs[0].activate(\"general\");\n }\n\n parseInputs(data) {\n var ret = {};\n retloop:\n for (var input in data) {\n var val = data[input];\n\n var parts = input.split('[');\n var last = ret;\n\n for (var i in parts) {\n var part = parts[i];\n if (part.substr(-1) == ']') {\n part = part.substr(0, part.length - 1);\n }\n\n if (i == parts.length - 1) {\n last[part] = val;\n continue retloop;\n } else if (!last.hasOwnProperty(part)) {\n last[part] = {};\n }\n last = last[part];\n }\n }\n return ret;\n }\n\n async _updateObject(event, formData) {\n //Remove custom settings if custom isn't selected to prevent losing them in the user save\n formData = this.parseInputs(formData);\n let sfxLine = formData.sfxLine;\n if (sfxLine) {\n sfxLine = Object.values(sfxLine);\n //Remove empty lines\n for (let i = sfxLine.length - 1; i >= 0; i--) {\n //also prevent bug #217, unknown cause\n if (sfxLine[i].diceType == undefined || sfxLine[i].diceType == \"\" || sfxLine[i].onResult == \"\" || Array.isArray(sfxLine[i].diceType) || Array.isArray(sfxLine[i].specialEffect))\n sfxLine.splice(i, 1);\n }\n //Remove duplicate lines\n let dataArr = sfxLine.map(item => {\n return [JSON.stringify(item), item]\n });\n let mapArr = new Map(dataArr);\n\n sfxLine = [...mapArr.values()];\n\n delete formData.sfxLine;\n }\n\n for (let scope in formData.appearance) {\n if (formData.appearance.hasOwnProperty(scope)) {\n if (formData.appearance[scope].colorset != \"custom\") {\n delete formData.appearance[scope].labelColor;\n delete formData.appearance[scope].diceColor;\n delete formData.appearance[scope].outlineColor;\n delete formData.appearance[scope].edgeColor;\n }\n }\n }\n let currentSettings = Dice3D.CONFIG();\n\n //required\n await game.user.unsetFlag(\"dice-so-nice\", \"sfxList\");\n await game.user.unsetFlag(\"dice-so-nice\", \"appearance\");\n await game.user.unsetFlag(\"dice-so-nice\", \"settings\");\n\n\n let appearance = foundry.utils.mergeObject(Dice3D.APPEARANCE(), formData.appearance, { insertKeys: true, insertValues: false, performDeletions:true});\n delete formData.appearance;\n let settings = foundry.utils.mergeObject(Dice3D.CONFIG(), formData, { insertKeys: false, insertValues: false ,performDeletions:true});\n\n // preserve rollingArea config\n settings.rollingArea = currentSettings.rollingArea;\n\n await game.user.setFlag('dice-so-nice', 'settings', settings);\n await game.user.setFlag(\"dice-so-nice\", \"appearance\", appearance);\n await game.user.setFlag(\"dice-so-nice\", \"sfxList\", sfxLine);\n\n game.socket.emit(\"module.dice-so-nice\", { type: \"update\", user: game.user.id });\n DiceSFXManager.init();\n ui.notifications.info(game.i18n.localize(\"DICESONICE.saveMessage\"));\n\n let reloadRequiredIfChanged = [\"canvasZIndex\", \"bumpMapping\", \"useHighDPI\", \"glow\", \"antialiasing\", \"enabled\"];\n let reloadRequired = reloadRequiredIfChanged.some(setting => settings[setting] != currentSettings[setting]);\n\n if (reloadRequired) {\n window.location.reload();\n } else {\n game.dice3d.update(settings);\n }\n }\n\n close(options) {\n super.close(options);\n this.box.clearScene();\n this.box.dicefactory.disposeCachedMaterials(\"showcase\");\n }\n\n async _onSubmit(event, options) {\n this.sfxDialogList.forEach((dialog) => {\n dialog.close();\n });\n await super._onSubmit(event, options);\n }\n}","import {Dice3D} from \"./Dice3D.js\";\n\nexport class RollableAreaConfig extends FormApplication {\n\n static get defaultOptions() {\n return foundry.utils.foundry.utils.mergeObject(super.defaultOptions, {\n title: game.i18n.localize(\"DICESONICE.RollableAreaConfigTitle\"),\n template: \"modules/dice-so-nice/templates/rollable-area-config.html\",\n width: 280,\n top: 70,\n left: window.innerWidth - 290\n });\n }\n\n render(force, context={}) {\n this.area = $(`\n <div class='dice-so-nice rollable-area'>\n <div class='resizers'>\n <div class='resizer nw'></div>\n <div class='resizer ne'></div>\n <div class='resizer sw'></div>\n <div class='resizer se'></div>\n <div class=\"info\">${game.i18n.localize(\"DICESONICE.RollableAreaText\")}</div> \n </div>\n </div>\n `);\n\n let rollingArea = Dice3D.CONFIG().rollingArea;\n if(!rollingArea) {\n const $diceBox = $(\"#dice-box-canvas\");\n rollingArea = {\n top: $diceBox.position().top,\n left: $diceBox.position().left,\n width: $diceBox.width(),\n height: $diceBox.height()\n }\n }\n console.log(rollingArea);\n this.area.appendTo($('body'));\n this.area.css(rollingArea);\n\n return super.render(force, context);\n }\n\n activateListeners(html) {\n super.activateListeners(html);\n html.find('button[name=\"restore\"]').click(this._onRestore.bind(this));\n\n let el = $(this.area).get(0);\n let resizing = false;\n this.area.mousedown(function(e) {\n let prevX = e.clientX;\n let prevY = e.clientY;\n\n window.addEventListener(\"mousemove\", onMouseMove);\n window.addEventListener(\"mouseup\", onMouseUp);\n\n function onMouseMove(e) {\n if (!resizing) {\n let newX = prevX - e.clientX;\n let newY = prevY - e.clientY;\n\n const rect = el.getBoundingClientRect();\n el.style.left = rect.left - newX + 'px';\n el.style.top = rect.top - newY + 'px';\n\n prevX = e.clientX;\n prevY = e.clientY;\n }\n }\n\n function onMouseUp() {\n window.removeEventListener(\"mousemove\", onMouseMove);\n window.removeEventListener(\"mouseup\", onMouseUp);\n }\n });\n\n const resizers = $(\".rollable-area > .resizers > .resizer\");\n for(let resizer of resizers) {\n $(resizer).mousedown(function (e) {\n resizing = true;\n let prevX = e.clientX;\n let prevY = e.clientY;\n\n window.addEventListener(\"mousemove\", onMouseMove);\n window.addEventListener(\"mouseup\", onMouseUp);\n\n function onMouseMove(e) {\n const rect = el.getBoundingClientRect();\n\n if(resizer.classList.contains(\"se\")) {\n el.style.width = rect.width - (prevX - e.clientX) + \"px\";\n el.style.height = rect.height - (prevY - e.clientY) + \"px\";\n }\n else if(resizer.classList.contains(\"sw\")) {\n el.style.width = rect.width + (prevX - e.clientX) + \"px\";\n el.style.height = rect.height - (prevY - e.clientY) + \"px\";\n el.style.left = rect.left - (prevX - e.clientX) + \"px\";\n }\n else if(resizer.classList.contains(\"ne\")) {\n el.style.width = rect.width - (prevX - e.clientX) + \"px\";\n el.style.height = rect.height + (prevY - e.clientY) + \"px\";\n el.style.top = rect.top - (prevY - e.clientY) + \"px\";\n }\n else {\n el.style.width = rect.width + (prevX - e.clientX) + \"px\";\n el.style.height = rect.height + (prevY - e.clientY) + \"px\";\n el.style.left = rect.left - (prevX - e.clientX) + \"px\";\n el.style.top = rect.top - (prevY - e.clientY) + \"px\";\n }\n\n prevX = e.clientX;\n prevY = e.clientY;\n }\n\n function onMouseUp() {\n window.removeEventListener(\"mousemove\", onMouseMove);\n window.removeEventListener(\"mouseup\", onMouseUp);\n resizing = false;\n }\n });\n }\n }\n\n async _onRestore() {\n await this.saveSettingsAndRebuild(false);\n await this.close();\n }\n\n async _updateObject() {\n await this.saveSettingsAndRebuild({\n top: this.area.position().top,\n left: this.area.position().left,\n width: this.area.width(),\n height: this.area.height()\n });\n }\n\n async saveSettingsAndRebuild(rollingArea) {\n let settings = foundry.utils.mergeObject(Dice3D.CONFIG(), {\n rollingArea: rollingArea\n },{performDeletions:true});\n await game.user.setFlag('dice-so-nice', 'settings', settings);\n game.dice3d.resizeAndRebuild();\n }\n\n async close(options={}) {\n this.area.remove();\n return super.close(options);\n }\n}","import { Dice3D } from './Dice3D.js';\nimport { DiceConfig } from './DiceConfig.js';\nimport { RollableAreaConfig } from './RollableAreaConfig.js';\nimport { Utils } from './Utils.js';\n\n/**\n * Registers the exposed settings for the various 3D dice options.\n */\nHooks.once('init', () => {\n const debouncedReload = foundry.utils.debounce(() => {\n window.location.reload();\n }, 100);\n game.settings.registerMenu(\"dice-so-nice\", \"dice-so-nice\", {\n name: \"DICESONICE.config\",\n label: \"DICESONICE.configTitle\",\n hint: \"DICESONICE.configHint\",\n icon: \"fas fa-dice-d20\",\n type: DiceConfig,\n restricted: false\n });\n\n game.settings.registerMenu(\"dice-so-nice\", \"rollable-area\", {\n name: \"DICESONICE.RollableAreaConfig\",\n label: \"DICESONICE.RollableAreaConfigTitle\",\n hint: \"DICESONICE.RollableAreaConfigHint\",\n icon: \"fas fa-crop-alt\",\n type: RollableAreaConfig,\n restricted: false\n });\n\n //Not used anymore but kept for compatibility with migration\n game.settings.register(\"dice-so-nice\", \"settings\", {\n name: \"3D Dice Settings\",\n scope: \"client\",\n default: {},\n type: Object,\n config: false\n });\n\n game.settings.register(\"dice-so-nice\", \"maxDiceNumber\", {\n name: \"DICESONICE.maxDiceNumber\",\n hint: \"DICESONICE.maxDiceNumberHint\",\n scope: \"world\",\n type: Number,\n default: 20,\n range: {\n min: 20,\n max: 100,\n step: 5\n },\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"globalAnimationSpeed\", {\n name: \"DICESONICE.globalAnimationSpeed\",\n hint: \"DICESONICE.globalAnimationSpeedHint\",\n scope: \"world\",\n type: String,\n choices: Utils.localize({\n \"0\": \"DICESONICE.PlayerSpeed\",\n \"1\": \"DICESONICE.NormalSpeed\",\n \"2\": \"DICESONICE.2xSpeed\",\n \"3\": \"DICESONICE.3xSpeed\"\n }),\n default: \"0\",\n config: true,\n onChange: debouncedReload\n });\n\n game.settings.register(\"dice-so-nice\", \"enabledSimultaneousRolls\", {\n name: \"DICESONICE.enabledSimultaneousRolls\",\n hint: \"DICESONICE.enabledSimultaneousRollsHint\",\n scope: \"world\",\n type: Boolean,\n default: true,\n config: true,\n onChange: debouncedReload\n });\n\n game.settings.register(\"dice-so-nice\", \"enabledSimultaneousRollForMessage\", {\n name: \"DICESONICE.enabledSimultaneousRollForMessage\",\n hint: \"DICESONICE.enabledSimultaneousRollForMessageHint\",\n scope: \"world\",\n type: Boolean,\n default: true,\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"diceCanBeFlipped\", {\n name: \"DICESONICE.diceCanBeFlipped\",\n hint: \"DICESONICE.diceCanBeFlippedHint\",\n scope: \"world\",\n type: Boolean,\n default: true,\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"formatVersion\", {\n scope: \"world\",\n type: String,\n default: \"\",\n config: false\n });\n\n game.settings.register(\"dice-so-nice\", \"disabledDuringCombat\", {\n name: \"DICESONICE.disabledDuringCombat\",\n hint: \"DICESONICE.disabledDuringCombatHint\",\n scope: \"world\",\n type: Boolean,\n default: false,\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"disabledForInitiative\", {\n name: \"DICESONICE.disabledForInitiative\",\n hint: \"DICESONICE.disabledForInitiativeHint\",\n scope: \"world\",\n type: Boolean,\n default: false,\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"immediatelyDisplayChatMessages\", {\n name: \"DICESONICE.immediatelyDisplayChatMessages\",\n hint: \"DICESONICE.immediatelyDisplayChatMessagesHint\",\n scope: \"world\",\n type: Boolean,\n default: false,\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"animateRollTable\", {\n name: \"DICESONICE.animateRollTable\",\n hint: \"DICESONICE.animateRollTableHint\",\n scope: \"world\",\n type: Boolean,\n default: false,\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"animateInlineRoll\", {\n name: \"DICESONICE.animateInlineRoll\",\n hint: \"DICESONICE.animateInlineRollHint\",\n scope: \"world\",\n type: Boolean,\n default: true,\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"hideNpcRolls\", {\n name: \"DICESONICE.hideNpcRolls\",\n hint: \"DICESONICE.hideNpcRollsHint\",\n scope: \"world\",\n type: Boolean,\n default: false,\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"allowInteractivity\", {\n name: \"DICESONICE.allowInteractivity\",\n hint: \"DICESONICE.allowInteractivityHint\",\n scope: \"world\",\n type: Boolean,\n default: true,\n config: true,\n onChange: debouncedReload\n });\n\n game.settings.register(\"dice-so-nice\", \"showGhostDice\", {\n name: \"DICESONICE.showGhostDice\",\n hint: \"DICESONICE.showGhostDiceHint\",\n scope: \"world\",\n type: Boolean,\n default: false,\n config: true\n });\n\n});\n\n/**\n * Foundry is ready, let's create a new Dice3D!\n */\nHooks.once('ready', () => {\n Utils.migrateOldSettings().then((updated) => {\n if (updated) {\n if (!game.settings.get(\"core\", \"noCanvas\"))\n game.dice3d = new Dice3D();\n else\n logger.warn(\"Dice So Nice! is disabled because the user has activated the 'No-Canvas' mode\");\n }\n });\n});\n\n/**\n * Intercepts all roll-type messages hiding the content until the animation is finished\n */\nHooks.on('createChatMessage', (chatMessage) => {\n //precheck for better perf\n let hasInlineRoll = game.settings.get(\"dice-so-nice\", \"animateInlineRoll\") && chatMessage.content.indexOf('inline-roll') !== -1;\n if ((!chatMessage.isRoll && !hasInlineRoll) || (!chatMessage.isContentVisible && !game.settings.get(\"dice-so-nice\", \"showGhostDice\")) ||\n (game.view != \"stream\" && (!game.dice3d || game.dice3d.messageHookDisabled)) ||\n (chatMessage.getFlag(\"core\", \"RollTable\") && !game.settings.get(\"dice-so-nice\", \"animateRollTable\"))) {\n return;\n }\n\n let rolls = chatMessage.isRoll ? chatMessage.rolls : null;\n let maxRollOrder = rolls ? 0 : -1;\n if (hasInlineRoll) {\n let JqInlineRolls = $($.parseHTML(`<div>${chatMessage.content}</div>`)).find(\".inline-roll.inline-result:not(.inline-dsn-hidden)\");\n if (JqInlineRolls.length == 0 && !chatMessage.isRoll) //it was a false positive\n return;\n let inlineRollList = [];\n JqInlineRolls.each((index, el) => {\n //We use the Roll class registered in the CONFIG constant in case the system overwrites it (eg: HeXXen)\n let roll = CONFIG.Dice.rolls[0].fromJSON(unescape(el.dataset.roll));\n maxRollOrder++;\n roll.dice.forEach(diceterm => {\n if (!diceterm.options.hasOwnProperty(\"rollOrder\"))\n diceterm.options.rollOrder = maxRollOrder;\n });\n inlineRollList.push(roll);\n });\n if (inlineRollList.length) {\n if (chatMessage.isRoll)\n inlineRollList = [...chatMessage.rolls, ...inlineRollList];\n\n let pool = PoolTerm.fromRolls(inlineRollList);\n //We use the Roll class registered in the CONFIG constant in case the system overwrites it (eg: HeXXen)\n rolls = [CONFIG.Dice.rolls[0].fromTerms([pool])];\n }\n else if (!chatMessage.isRoll)\n return;\n }\n\n //Because Better Roll 5e sends an empty roll object sometime\n if (!rolls.length || !rolls[0].dice.length)\n return;\n\n const isInitiativeRoll = chatMessage.getFlag(\"core\", \"initiativeRoll\");\n if (isInitiativeRoll && game.settings.get(\"dice-so-nice\", \"disabledForInitiative\"))\n return;\n\n //Remove the chatmessage sound if it is the core dice sound.\n if (Dice3D.CONFIG().enabled && chatMessage.sound == \"sounds/dice.wav\") {\n foundry.utils.mergeObject(chatMessage, { \"-=sound\": null }, { performDeletions: true });\n }\n chatMessage._dice3danimating = true;\n\n game.dice3d.renderRolls(chatMessage, rolls);\n});\n\n/**\n * Hide messages which are animating rolls.\n */\nHooks.on(\"renderChatMessage\", (message, html, data) => {\n if (game.dice3d && game.dice3d.messageHookDisabled) {\n return;\n }\n if (message._dice3danimating && !game.settings.get(\"dice-so-nice\", \"immediatelyDisplayChatMessages\")) {\n\n if (message._countNewRolls)\n html.find(`.dice-roll:nth-last-child(-n+${message._countNewRolls})`).addClass(\"dsn-hide\");\n else\n html.addClass(\"dsn-hide\");\n }\n});\n\n/**\n * Save the number of new rolls in the message before it is updated.\n */\nHooks.on(\"preUpdateChatMessage\", (message, updateData, options) => {\n if (!(\"rolls\" in updateData)) return;\n // We test against the source data in case the system/macro/module has modified the scoped message variable\n options.dsnCountAddedRoll = updateData.rolls.length - message.toObject().rolls.length;\n});\n\n/**\n * Hide and roll new rolls added in a chat message in a update\n */\nHooks.on(\"updateChatMessage\", (message, updateData, options) => {\n //Todo: refactor this check into a function\n if (!message.rolls || !message.isRoll || (!message.isContentVisible && !game.settings.get(\"dice-so-nice\", \"showGhostDice\")) ||\n (game.view != \"stream\" && (!game.dice3d || game.dice3d.messageHookDisabled)) ||\n (message.getFlag(\"core\", \"RollTable\") && !game.settings.get(\"dice-so-nice\", \"animateRollTable\"))) {\n return;\n }\n if (options.dsnCountAddedRoll > 0) {\n message._dice3danimating = true;\n message._countNewRolls = options.dsnCountAddedRoll;\n game.dice3d.renderRolls(message, message.rolls.slice(-options.dsnCountAddedRoll));\n }\n});\n\ndocument.addEventListener(\"visibilitychange\", function () {\n //if there was roll while the tab was hidden\n if (!document.hidden && game.dice3d && game.dice3d.hiddenAnimationQueue && game.dice3d.hiddenAnimationQueue.length) {\n let now = (new Date()).getTime();\n for (let i = 0; i < game.dice3d.hiddenAnimationQueue.length; i++) {\n let anim = game.dice3d.hiddenAnimationQueue[i];\n if (now - anim.timestamp > 10000) {\n anim.resolve(false);\n } else {\n game.dice3d._showAnimation(anim.data, anim.config).then(displayed => {\n anim.resolve(displayed);\n });\n }\n }\n game.dice3d.hiddenAnimationQueue = [];\n }\n});"],"names":["ShaderUtils","static","shader","undefined","this","emissive","game","dice3d","DiceFactory","realisticLighting","selectiveBloomShaderFragment","userData","iridescent","iridescentShaderFragment","shaderName","transmission","transmissionAlphaShaderFragment","iridescence","iridescenceShaderFragment","fragmentShader","replace","uniforms","globalBloom","iridescenceLookUp","iridescenceNoise","boost","vertexShader","DicePreset","constructor","type","shape","term","scale","labels","valueMap","values","bumps","emissiveMaps","mass","inertia","geometry","model","system","modelLoaded","modelLoading","modelFile","internalAdd","appearance","labelColor","diceColor","outlineColor","edgeColor","texture","material","font","colorset","setValues","min","max","step","range","setValueMap","map","count","i","registerFaces","faces","tab","push","includes","a","b","c","d","Array","prototype","apply","setLabels","setBumpMaps","setEmissiveMaps","loadTextures","Promise","resolve","reject","textures","textureTypeLoaded","loadedImages","numImages","length","regexTexture","imgElements","hasTextures","match","Image","crossOrigin","textureType","onload","bind","onerror","console","error","src","start","stop","setModel","file","loadModel","loader","load","gltf","scene","traverse","node","isMesh","castShadow","onBeforeCompile","applyDiceSoNiceShader","anisotropy","box","normalMap","emissiveMap","roughnessMap","metalnessMap","Hooks","callAll","BASE_PRESETS_LIST","EXTRA_PRESETS_LIST","diceobj","bumpMaps","fontScale","TEXTURELIST","none","name","composite","source","bump","cloudy","cloudy_2","fire","marble","water","water_2","ice","ice_2","paper","speckles","glitter","glitter_2","stars","stainedglass","skulls","leopard","tiger","cheetah","dragon","lizard","bird","astral","wood","metal","stone","radial","bronze01","bronze02","bronze03","bronze03a","bronze03b","bronze04","COLORSETS","coin_default","description","category","foreground","background","outline","edge","visibility","spectrum_default","radiant","cold","poison","acid","thunder","lightning","air","earth","force","psychic","necrotic","breebaby","pinkdreams","inspired","bloodmoon","starynight","glitterparty","astralsea","foundry","dragons","birdup","tigerking","toxic","rainbow","random","black","white","grey","red","blue","green","yellow","pink","cyan","prism","bronze","custom","DICE_SCALE","d2","d4","d6","d8","d10","d12","d14","d16","d20","d24","d30","d3","d5","d7","df","d100","DiceColors","sources","callback","images","itemprops","Object","entries","key","value","diceTextures","utils","mergeObject","performDeletions","diceBumps","texturename","isArray","l","getTexture","names","keys","pop","Math","floor","rgb","parseInt","sets","uniqueSet","data","id","inplace","randcolor","randomColor","randtex","colorsetname","DICE_MODELS","metadata","version","generator","uuid","attributes","position","itemSize","array","normalized","normal","uv","color","index","boundingSphere","center","radius","faceValues","rotationCombinations","EventDispatcher","addEventListener","listener","_listeners","listeners","indexOf","hasEventListener","removeEventListener","listenerArray","splice","dispatchEvent","event","target","slice","call","_lut","_seed","DEG2RAD","PI","RAD2DEG","generateUUID","d0","d1","toLowerCase","clamp","euclideanModulo","n","m","lerp","x","y","t","isPowerOfTwo","ceilPowerOfTwo","pow","ceil","log","LN2","floorPowerOfTwo","denormalize","Float32Array","Uint32Array","Uint16Array","Uint8Array","Int32Array","Int16Array","Int8Array","Error","normalize","round","MathUtils","mapLinear","a1","a2","b1","b2","inverseLerp","damp","lambda","dt","exp","pingpong","abs","smoothstep","smootherstep","randInt","low","high","randFloat","randFloatSpread","seededRandom","s","imul","degToRad","degrees","radToDeg","radians","setQuaternionFromProperEuler","q","order","cos","sin","c2","s2","c13","s13","c1_3","s1_3","c3_1","s3_1","set","warn","Vector2","isVector2","width","height","setScalar","scalar","setX","setY","setComponent","getComponent","clone","copy","v","add","addScalar","addVectors","addScaledVector","sub","subScalar","subVectors","multiply","multiplyScalar","divide","divideScalar","applyMatrix3","e","elements","clampScalar","minVal","maxVal","clampLength","roundToZero","trunc","negate","dot","cross","lengthSq","sqrt","manhattanLength","angle","atan2","angleTo","denominator","theta","acos","distanceTo","distanceToSquared","dx","dy","manhattanDistanceTo","setLength","alpha","lerpVectors","v1","v2","equals","fromArray","offset","toArray","fromBufferAttribute","attribute","getX","getY","rotateAround","Symbol","iterator","Matrix3","n11","n12","n13","n21","n22","n23","n31","n32","n33","isMatrix3","te","identity","me","extractBasis","xAxis","yAxis","zAxis","setFromMatrix3Column","setFromMatrix4","multiplyMatrices","premultiply","ae","be","a11","a12","a13","a21","a22","a23","a31","a32","a33","b11","b12","b13","b21","b22","b23","b31","b32","b33","determinant","f","g","h","invert","t11","t12","t13","det","detInv","transpose","tmp","getNormalMatrix","matrix4","transposeIntoArray","r","setUvTransform","tx","ty","sx","sy","rotation","cx","cy","_m3","makeScale","rotate","makeRotation","translate","makeTranslation","matrix","arrayNeedsUint32","TYPED_ARRAYS","Uint8ClampedArray","Float64Array","getTypedArray","buffer","createElementNS","document","createCanvasElement","canvas","style","display","_cache","warnOnce","message","LINEAR_SRGB_TO_LINEAR_DISPLAY_P3","LINEAR_DISPLAY_P3_TO_LINEAR_SRGB","COLOR_SPACES","transfer","primaries","toReference","fromReference","srgb","convertSRGBToLinear","convertLinearToSRGB","SUPPORTED_WORKING_COLOR_SPACES","Set","ColorManagement","enabled","_workingColorSpace","legacyMode","workingColorSpace","colorSpace","has","convert","sourceColorSpace","targetColorSpace","sourceToReference","targetFromReference","fromWorkingColorSpace","toWorkingColorSpace","getPrimaries","getTransfer","SRGBToLinear","LinearToSRGB","_canvas","ImageUtils","image","test","HTMLCanvasElement","context","getContext","ImageData","putImageData","drawImage","toDataURL","HTMLImageElement","ImageBitmap","imageData","getImageData","_sourceId","Source","isSource","defineProperty","needsUpdate","toJSON","meta","isRootObject","output","url","isDataTexture","serializeImage","getDataURL","from","_textureId","Texture","DEFAULT_IMAGE","mapping","DEFAULT_MAPPING","wrapS","wrapT","magFilter","minFilter","format","DEFAULT_ANISOTROPY","super","isTexture","mipmaps","channel","internalFormat","repeat","matrixAutoUpdate","generateMipmaps","premultiplyAlpha","flipY","unpackAlignment","onUpdate","isRenderTargetTexture","needsPMREMUpdate","updateMatrix","JSON","parse","stringify","wrap","dispose","transformUv","encoding","Vector4","z","w","isVector4","setZ","setW","applyMatrix4","setAxisAngleFromQuaternion","setAxisAngleFromRotationMatrix","epsilon","epsilon2","m11","m12","m13","m21","m22","m23","m31","m32","m33","xx","yy","zz","xy","xz","yz","getZ","getW","RenderTarget","options","isRenderTarget","depth","scissor","scissorTest","viewport","assign","depthBuffer","stencilBuffer","depthTexture","samples","setSize","WebGLRenderTarget","isWebGLRenderTarget","DataArrayTexture","isDataArrayTexture","wrapR","Data3DTexture","isData3DTexture","Quaternion","isQuaternion","_x","_y","_z","_w","dst","dstOffset","src0","srcOffset0","src1","srcOffset1","x0","y0","z0","w0","x1","y1","z1","w1","dir","sqrSin","Number","EPSILON","len","tDir","_onChangeCallback","quaternion","setFromEuler","euler","update","_order","c1","c3","s1","s3","setFromAxisAngle","axis","halfAngle","setFromRotationMatrix","trace","setFromUnitVectors","vFrom","vTo","rotateTowards","slerp","conjugate","multiplyQuaternions","qax","qay","qaz","qaw","qbx","qby","qbz","qbw","qb","cosHalfTheta","sqrSinHalfTheta","sinHalfTheta","halfTheta","ratioA","ratioB","slerpQuaternions","qa","u1","sqrt1u1","sqrtu1","u2","u3","_onChange","Vector3","isVector3","multiplyVectors","applyEuler","applyQuaternion","_quaternion$4","applyAxisAngle","applyNormalMatrix","vx","vy","vz","qx","qy","qz","qw","tz","project","camera","matrixWorldInverse","projectionMatrix","unproject","projectionMatrixInverse","matrixWorld","transformDirection","crossVectors","ax","ay","az","bx","by","bz","projectOnVector","projectOnPlane","planeNormal","_vector$b","reflect","dz","setFromSpherical","setFromSphericalCoords","phi","sinPhiRadius","setFromCylindrical","setFromCylindricalCoords","setFromMatrixPosition","setFromMatrixScale","setFromMatrixColumn","sz","setFromColor","randomDirection","u","Box3","Infinity","isBox3","setFromArray","makeEmpty","il","expandByPoint","_vector$a","setFromBufferAttribute","setFromPoints","points","setFromCenterAndSize","size","halfSize","setFromObject","object","precise","expandByObject","isEmpty","getCenter","getSize","point","expandByVector","vector","expandByScalar","updateWorldMatrix","positionAttribute","getAttribute","isInstancedMesh","getVertexPosition","boundingBox","computeBoundingBox","_box$3","union","children","containsPoint","containsBox","getParameter","intersectsBox","intersectsSphere","sphere","clampPoint","intersectsPlane","plane","constant","intersectsTriangle","triangle","_center","_extents","_v0$2","_v1$7","_v2$4","_f0","_f1","_f2","axes","satForAxes","_triangleNormal","distanceToPoint","getBoundingSphere","intersect","_points","_testAxis","v0","extents","j","p0","p1","p2","_box$2","_v1$6","_v2$3","Sphere","optionalCenter","maxRadiusSq","radiusSum","deltaLengthSq","getBoundingBox","getMaxScaleOnAxis","delta","_vector$9","_segCenter","_segDir","_diff","_edge1","_edge2","_normal$1","Ray","origin","direction","ray","at","lookAt","recast","closestPointToPoint","directionDistance","distanceSqToPoint","distanceSqToSegment","optionalPointOnRay","optionalPointOnSegment","segExtent","a01","b0","s0","sqrDist","extDet","invDet","intersectSphere","tca","radius2","thc","t0","t1","distanceToPlane","intersectPlane","distToPoint","intersectBox","tmin","tmax","tymin","tymax","tzmin","tzmax","invdirx","invdiry","invdirz","isNaN","intersectTriangle","backfaceCulling","sign","DdN","DdQxE2","DdE1xQ","QdN","Matrix4","n14","n24","n34","n41","n42","n43","n44","isMatrix4","copyPosition","setFromMatrix3","makeBasis","extractRotation","scaleX","_v1$5","scaleY","scaleZ","makeRotationFromEuler","af","bf","ce","cf","de","ac","ad","bc","bd","makeRotationFromQuaternion","compose","_zero","_one","eye","up","a14","a24","a34","a41","a42","a43","a44","b14","b24","b34","b41","b42","b43","b44","setPosition","t14","scaleXSq","scaleYSq","scaleZSq","makeRotationX","makeRotationY","makeRotationZ","makeRotationAxis","makeShear","yx","zx","zy","x2","y2","z2","wx","wy","wz","decompose","_m1$2","invSX","invSY","invSZ","makePerspective","left","right","top","bottom","near","far","coordinateSystem","makeOrthographic","p","zInv","_matrix","_quaternion$3","Euler","DEFAULT_ORDER","isEuler","asin","setFromQuaternion","setFromVector3","reorder","newOrder","Layers","mask","enable","enableAll","toggle","disable","disableAll","layers","isEnabled","_object3DId","_v1$4","_q1","_m1$1","_target","_position$3","_scale$2","_quaternion$2","_xAxis","_yAxis","_zAxis","_addedEvent","_removedEvent","Object3D","isObject3D","parent","DEFAULT_UP","onRotationChange","onQuaternionChange","defineProperties","configurable","enumerable","modelViewMatrix","normalMatrix","DEFAULT_MATRIX_AUTO_UPDATE","matrixWorldNeedsUpdate","matrixWorldAutoUpdate","DEFAULT_MATRIX_WORLD_AUTO_UPDATE","visible","receiveShadow","frustumCulled","renderOrder","animations","onBeforeRender","onAfterRender","setRotationFromAxisAngle","setRotationFromEuler","setRotationFromMatrix","setRotationFromQuaternion","rotateOnAxis","rotateOnWorldAxis","rotateX","rotateY","rotateZ","translateOnAxis","distance","translateX","translateY","translateZ","localToWorld","worldToLocal","isCamera","isLight","arguments","remove","removeFromParent","clear","attach","getObjectById","getObjectByProperty","getObjectByName","getObjectsByProperty","result","childResult","concat","getWorldPosition","getWorldQuaternion","getWorldScale","getWorldDirection","raycast","traverseVisible","traverseAncestors","updateMatrixWorld","child","updateParents","updateChildren","geometries","materials","shapes","skeletons","nodes","serialize","library","element","instanceMatrix","instanceColor","isScene","isColor","environment","isLine","isPoints","parameters","isSkinnedMesh","bindMode","bindMatrix","skeleton","uuids","animation","extractFromCache","cache","recursive","_v0$1","_v1$3","_v2$2","_v3$1","_vab","_vac","_vbc","_vap","_vbp","_vcp","warnedGetUV","Triangle","targetLengthSq","dot00","dot01","dot02","dot11","dot12","denom","invDenom","getBarycoord","p3","uv1","uv2","uv3","getInterpolation","v3","setFromPointsAndIndices","i0","i1","i2","setFromAttributeAndIndices","getArea","getMidpoint","getNormal","getPlane","setFromCoplanarPoints","getUV","isFrontFacing","vc","vb","va","_colorKeywords","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","blanchedalmond","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","plum","powderblue","purple","rebeccapurple","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","whitesmoke","yellowgreen","_hslA","_hslB","hue2rgb","Color","setHex","setStyle","setRGB","hex","setHSL","handleAlpha","string","parseFloat","exec","components","charAt","setColorName","copySRGBToLinear","copyLinearToSRGB","getHex","_color","getHexString","toString","getHSL","hue","saturation","lightness","getRGB","getStyle","toFixed","offsetHSL","addColors","color1","color2","lerpColors","lerpHSL","NAMES","_materialId","Material","isMaterial","blending","side","vertexColors","opacity","transparent","alphaHash","blendSrc","blendDst","blendEquation","blendSrcAlpha","blendDstAlpha","blendEquationAlpha","blendColor","blendAlpha","depthFunc","depthTest","depthWrite","stencilWriteMask","stencilFunc","stencilRef","stencilFuncMask","stencilFail","stencilZFail","stencilZPass","stencilWrite","clippingPlanes","clipIntersection","clipShadows","shadowSide","colorWrite","precision","polygonOffset","polygonOffsetFactor","polygonOffsetUnits","dithering","alphaToCoverage","premultipliedAlpha","forceSinglePass","toneMapped","_alphaTest","alphaTest","onBuild","customProgramCacheKey","newValue","currentValue","roughness","metalness","sheen","sheenColor","sheenRoughness","emissiveIntensity","specular","specularIntensity","specularColor","shininess","clearcoat","clearcoatRoughness","clearcoatMap","clearcoatRoughnessMap","clearcoatNormalMap","clearcoatNormalScale","iridescenceIOR","iridescenceThicknessRange","iridescenceMap","iridescenceThicknessMap","anisotropyRotation","anisotropyMap","matcap","alphaMap","lightMap","lightMapIntensity","aoMap","aoMapIntensity","bumpMap","bumpScale","normalMapType","normalScale","displacementMap","displacementScale","displacementBias","specularMap","specularIntensityMap","specularColorMap","envMap","combine","envMapIntensity","reflectivity","refractionRatio","gradientMap","transmissionMap","thickness","thicknessMap","attenuationDistance","attenuationColor","sizeAttenuation","linewidth","dashSize","gapSize","wireframe","wireframeLinewidth","wireframeLinecap","wireframeLinejoin","flatShading","fog","srcPlanes","dstPlanes","MeshBasicMaterial","isMeshBasicMaterial","_tables","_generateTables","ArrayBuffer","floatView","uint32View","baseTable","shiftTable","mantissaTable","exponentTable","offsetTable","DataUtils","toHalfFloat","val","fromHalfFloat","_vector$8","_vector2$1","BufferAttribute","TypeError","isBufferAttribute","usage","updateRange","gpuType","onUploadCallback","setUsage","copyAt","index1","index2","copyArray","setXY","setXYZ","component","setXYZW","onUpload","Uint16BufferAttribute","Uint32BufferAttribute","Float32BufferAttribute","_id$2","_m1","_obj","_offset","_box$1","_boxMorphTargets","_vector$7","BufferGeometry","isBufferGeometry","morphAttributes","morphTargetsRelative","groups","drawRange","getIndex","setIndex","setAttribute","deleteAttribute","hasAttribute","addGroup","materialIndex","clearGroups","setDrawRange","tangent","computeBoundingSphere","morphAttributesPosition","isGLBufferAttribute","morphAttribute","jl","computeTangents","indices","positions","normals","uvs","nVertices","tangents","tan1","tan2","vA","vB","vC","uvA","uvB","uvC","sdir","tdir","handleTriangle","isFinite","group","tmp2","n2","handleVertex","computeVertexNormals","normalAttribute","pA","pB","pC","nA","nB","nC","cb","ab","normalizeNormals","toNonIndexed","convertBufferAttribute","array2","isInterleavedBufferAttribute","stride","geometry2","newAttribute","morphArray","hasMorphAttributes","attributeArray","_inverseMatrix$3","_ray$3","_sphere$5","_sphereHitAt","_vA$1","_vB$1","_vC$1","_tempA","_morphA","_uvA$1","_uvB$1","_uvC$1","_normalA","_normalB","_normalC","_intersectionPoint","_intersectionPointWorld","Mesh","updateMorphTargets","morphTargetInfluences","morphTargetDictionary","ml","String","morphPosition","morphInfluences","influence","raycaster","intersects","_computeIntersections","rayLocalSpace","intersection","groupMaterial","checkGeometryIntersection","faceIndex","face","checkIntersection","BoxGeometry","widthSegments","heightSegments","depthSegments","scope","vertices","numberOfVertices","groupStart","buildPlane","udir","vdir","gridX","gridY","segmentWidth","segmentHeight","widthHalf","heightHalf","depthHalf","gridX1","gridY1","vertexCounter","groupCount","iy","ix","cloneUniforms","property","mergeUniforms","merged","getUnlitUniformColorSpace","renderer","getRenderTarget","outputColorSpace","UniformsUtils","merge","ShaderMaterial","isShaderMaterial","defines","uniformsGroups","lights","clipping","extensions","derivatives","fragDepth","drawBuffers","shaderTextureLOD","defaultAttributeValues","index0AttributeName","uniformsNeedUpdate","glslVersion","cloneUniformsGroups","Camera","PerspectiveCamera","fov","aspect","isPerspectiveCamera","zoom","focus","view","filmGauge","filmOffset","updateProjectionMatrix","setFocalLength","focalLength","vExtentSlope","getFilmHeight","atan","getFocalLength","getEffectiveFOV","getFilmWidth","setViewOffset","fullWidth","fullHeight","offsetX","offsetY","clearViewOffset","skew","CubeCamera","renderTarget","activeMipmapLevel","cameraPX","cameraNX","cameraPY","cameraNY","cameraPZ","cameraNZ","updateCoordinateSystem","cameras","currentRenderTarget","currentActiveCubeFace","getActiveCubeFace","currentActiveMipmapLevel","getActiveMipmapLevel","currentXrEnabled","xr","setRenderTarget","render","CubeTexture","isCubeTexture","WebGLCubeRenderTarget","isWebGLCubeRenderTarget","fromEquirectangularTexture","tEquirect","mesh","currentMinFilter","stencil","_vector1","_vector2","_normalMatrix","Plane","isPlane","setComponents","setFromNormalAndCoplanarPoint","inverseNormalLength","distanceToSphere","projectPoint","intersectLine","line","intersectsLine","startSign","endSign","end","coplanarPoint","optionalNormalMatrix","referencePoint","_sphere$4","_vector$6","Frustum","p4","p5","planes","frustum","setFromProjectionMatrix","me0","me1","me2","me3","me4","me5","me6","me7","me8","me9","me10","me11","me12","me13","me14","me15","intersectsObject","intersectsSprite","sprite","negRadius","WebGLAnimation","isAnimating","animationLoop","requestId","onAnimationFrame","time","frame","requestAnimationFrame","cancelAnimationFrame","setAnimationLoop","setContext","WebGLAttributes","gl","capabilities","isWebGL2","buffers","WeakMap","get","deleteBuffer","delete","bufferType","cached","bytesPerElement","elementSize","createBuffer","bindBuffer","bufferData","FLOAT","isFloat16BufferAttribute","HALF_FLOAT","UNSIGNED_SHORT","SHORT","UNSIGNED_INT","INT","BYTE","UNSIGNED_BYTE","BYTES_PER_ELEMENT","updateBuffer","bufferSubData","subarray","PlaneGeometry","width_half","height_half","segment_width","segment_height","ShaderChunk","alphahash_fragment","alphahash_pars_fragment","alphamap_fragment","alphamap_pars_fragment","alphatest_fragment","alphatest_pars_fragment","aomap_fragment","aomap_pars_fragment","begin_vertex","beginnormal_vertex","bsdfs","iridescence_fragment","bumpmap_pars_fragment","clipping_planes_fragment","clipping_planes_pars_fragment","clipping_planes_pars_vertex","clipping_planes_vertex","color_fragment","color_pars_fragment","color_pars_vertex","color_vertex","common","cube_uv_reflection_fragment","defaultnormal_vertex","displacementmap_pars_vertex","displacementmap_vertex","emissivemap_fragment","emissivemap_pars_fragment","colorspace_fragment","colorspace_pars_fragment","envmap_fragment","envmap_common_pars_fragment","envmap_pars_fragment","envmap_pars_vertex","envmap_physical_pars_fragment","envmap_vertex","fog_vertex","fog_pars_vertex","fog_fragment","fog_pars_fragment","gradientmap_pars_fragment","lightmap_fragment","lightmap_pars_fragment","lights_lambert_fragment","lights_lambert_pars_fragment","lights_pars_begin","lights_toon_fragment","lights_toon_pars_fragment","lights_phong_fragment","lights_phong_pars_fragment","lights_physical_fragment","lights_physical_pars_fragment","lights_fragment_begin","lights_fragment_maps","lights_fragment_end","logdepthbuf_fragment","logdepthbuf_pars_fragment","logdepthbuf_pars_vertex","logdepthbuf_vertex","map_fragment","map_pars_fragment","map_particle_fragment","map_particle_pars_fragment","metalnessmap_fragment","metalnessmap_pars_fragment","morphcolor_vertex","morphnormal_vertex","morphtarget_pars_vertex","morphtarget_vertex","normal_fragment_begin","normal_fragment_maps","normal_pars_fragment","normal_pars_vertex","normal_vertex","normalmap_pars_fragment","clearcoat_normal_fragment_begin","clearcoat_normal_fragment_maps","clearcoat_pars_fragment","iridescence_pars_fragment","opaque_fragment","packing","premultiplied_alpha_fragment","project_vertex","dithering_fragment","dithering_pars_fragment","roughnessmap_fragment","roughnessmap_pars_fragment","shadowmap_pars_fragment","shadowmap_pars_vertex","shadowmap_vertex","shadowmask_pars_fragment","skinbase_vertex","skinning_pars_vertex","skinning_vertex","skinnormal_vertex","specularmap_fragment","specularmap_pars_fragment","tonemapping_fragment","tonemapping_pars_fragment","transmission_fragment","transmission_pars_fragment","uv_pars_fragment","uv_pars_vertex","uv_vertex","worldpos_vertex","background_vert","background_frag","backgroundCube_vert","backgroundCube_frag","cube_vert","cube_frag","depth_vert","depth_frag","distanceRGBA_vert","distanceRGBA_frag","equirect_vert","equirect_frag","linedashed_vert","linedashed_frag","meshbasic_vert","meshbasic_frag","meshlambert_vert","meshlambert_frag","meshmatcap_vert","meshmatcap_frag","meshnormal_vert","meshnormal_frag","meshphong_vert","meshphong_frag","meshphysical_vert","meshphysical_frag","meshtoon_vert","meshtoon_frag","points_vert","points_frag","shadow_vert","shadow_frag","sprite_vert","sprite_frag","UniformsLib","diffuse","mapTransform","alphaMapTransform","specularmap","specularMapTransform","envmap","flipEnvMap","ior","aomap","aoMapTransform","lightmap","lightMapTransform","bumpmap","bumpMapTransform","normalmap","normalMapTransform","displacementmap","displacementMapTransform","emissivemap","emissiveMapTransform","metalnessmap","metalnessMapTransform","roughnessmap","roughnessMapTransform","gradientmap","fogDensity","fogNear","fogFar","fogColor","ambientLightColor","lightProbe","directionalLights","properties","directionalLightShadows","shadowBias","shadowNormalBias","shadowRadius","shadowMapSize","directionalShadowMap","directionalShadowMatrix","spotLights","coneCos","penumbraCos","decay","spotLightShadows","spotLightMap","spotShadowMap","spotLightMatrix","pointLights","pointLightShadows","shadowCameraNear","shadowCameraFar","pointShadowMap","pointShadowMatrix","hemisphereLights","skyColor","groundColor","rectAreaLights","ltc_1","ltc_2","uvTransform","ShaderLib","basic","lambert","phong","standard","toon","dashed","totalSize","t2D","backgroundIntensity","backgroundCube","backgroundBlurriness","cube","tCube","tFlip","equirect","distanceRGBA","referencePosition","nearDistance","farDistance","shadow","physical","clearcoatMapTransform","clearcoatNormalMapTransform","clearcoatRoughnessMapTransform","iridescenceMapTransform","iridescenceThicknessMinimum","iridescenceThicknessMaximum","iridescenceThicknessMapTransform","sheenColorMap","sheenColorMapTransform","sheenRoughnessMap","sheenRoughnessMapTransform","transmissionMapTransform","transmissionSamplerSize","transmissionSamplerMap","thicknessMapTransform","specularColorMapTransform","specularIntensityMapTransform","anisotropyVector","anisotropyMapTransform","_rgb","WebGLBackground","cubemaps","cubeuvmaps","state","objects","clearColor","planeMesh","boxMesh","clearAlpha","currentBackground","currentBackgroundVersion","currentTonemapping","setClear","getClearColor","setClearColor","getClearAlpha","setClearAlpha","renderList","forceClear","environmentBlendMode","getEnvironmentBlendMode","autoClear","autoClearColor","autoClearDepth","autoClearStencil","toneMapping","unshift","WebGLBindingStates","maxVertexAttributes","MAX_VERTEX_ATTRIBS","extension","vaoAvailable","bindingStates","defaultState","createBindingState","currentState","forceUpdate","bindVertexArrayObject","vao","bindVertexArray","bindVertexArrayOES","deleteVertexArrayObject","deleteVertexArray","deleteVertexArrayOES","newAttributes","enabledAttributes","attributeDivisors","program","initAttributes","enableAttribute","enableAttributeAndDivisor","meshPerAttribute","enableVertexAttribArray","disableUnusedAttributes","disableVertexAttribArray","vertexAttribPointer","integer","vertexAttribIPointer","reset","resetDefaultState","setup","updateBuffers","getBindingState","programMap","stateMap","createVertexArrayObject","createVertexArray","createVertexArrayOES","cachedAttributes","geometryAttributes","attributesNum","programAttributes","getAttributes","location","cachedAttribute","geometryAttribute","saveCache","ELEMENT_ARRAY_BUFFER","setupVertexAttributes","isInstancedBufferGeometry","materialDefaultAttributeValues","programAttribute","isInstancedInterleavedBuffer","locationSize","_maxInstanceCount","ARRAY_BUFFER","isInstancedBufferAttribute","vertexAttrib2fv","vertexAttrib3fv","vertexAttrib4fv","vertexAttrib1fv","geometryId","programId","releaseStatesOfGeometry","releaseStatesOfProgram","WebGLBufferRenderer","info","mode","setMode","drawArrays","renderInstances","primcount","methodName","WebGLCapabilities","maxAnisotropy","getMaxPrecision","getShaderPrecisionFormat","VERTEX_SHADER","HIGH_FLOAT","FRAGMENT_SHADER","MEDIUM_FLOAT","WebGL2RenderingContext","maxPrecision","logarithmicDepthBuffer","maxTextures","MAX_TEXTURE_IMAGE_UNITS","maxVertexTextures","MAX_VERTEX_TEXTURE_IMAGE_UNITS","maxTextureSize","MAX_TEXTURE_SIZE","maxCubemapSize","MAX_CUBE_MAP_TEXTURE_SIZE","maxAttributes","maxVertexUniforms","MAX_VERTEX_UNIFORM_VECTORS","maxVaryings","MAX_VARYING_VECTORS","maxFragmentUniforms","MAX_FRAGMENT_UNIFORM_VECTORS","vertexTextures","floatFragmentTextures","getMaxAnisotropy","MAX_TEXTURE_MAX_ANISOTROPY_EXT","floatVertexTextures","maxSamples","MAX_SAMPLES","WebGLClipping","globalState","numGlobalPlanes","localClippingEnabled","renderingShadows","viewNormalMatrix","uniform","projectPlanes","skipTransform","nPlanes","dstArray","flatSize","viewMatrix","i4","numPlanes","numIntersection","init","enableLocalClipping","beginShadows","endShadows","setGlobalState","setState","useCache","materialProperties","resetGlobalState","nGlobal","lGlobal","clippingState","WebGLCubeMaps","mapTextureMapping","onTextureDispose","cubemap","OrthographicCamera","isOrthographicCamera","scaleW","scaleH","EXTRA_LOD_SIGMA","_flatCamera","_clearColor","_oldTarget","_oldActiveCubeFace","_oldActiveMipmapLevel","PHI","INV_PHI","_axisDirections","PMREMGenerator","_renderer","_pingPongRenderTarget","_lodMax","_cubeSize","_lodPlanes","_sizeLods","_sigmas","_blurMaterial","_cubemapMaterial","_equirectMaterial","_compileMaterial","fromScene","sigma","_setSize","cubeUVRenderTarget","_allocateTargets","_sceneToCubeUV","_blur","_applyPMREM","_cleanup","fromEquirectangular","equirectangular","_fromTexture","fromCubemap","compileCubemapShader","_getCubemapMaterial","compileEquirectangularShader","_getEquirectMaterial","_dispose","cubeSize","log2","outputTarget","_setViewport","_textureToCubeUV","params","_createRenderTarget","sizeLods","lodPlanes","sigmas","_createPlanes","lodMax","lod","totalLods","sizeLod","texelSize","cubeFaces","positionSize","uvSize","faceIndexSize","coordinates","fill","_getBlurShader","weights","poleAxis","CUBEUV_TEXEL_WIDTH","CUBEUV_TEXEL_HEIGHT","CUBEUV_MAX_MIP","latitudinal","dTheta","mipInt","_getCommonVertexShader","tmpMesh","compile","cubeCamera","upSign","forwardSign","originalAutoClear","backgroundMaterial","backgroundBox","useSolidColor","col","lodIn","lodOut","pingPongRenderTarget","_halfBlur","targetIn","targetOut","sigmaRadians","blurMaterial","blurMesh","blurUniforms","pixels","radiansPerPixel","sigmaPixels","sum","weight","outputSize","WebGLCubeUVMaps","cubeUVmaps","pmremGenerator","cubemapUV","isEquirectMap","isCubeMap","isCubeTextureComplete","WebGLExtensions","getExtension","WebGLGeometries","wireframeAttributes","onGeometryDispose","memory","updateWireframeAttribute","geometryIndex","geometryPosition","previousAttribute","getWireframeAttribute","currentAttribute","WebGLIndexedBufferRenderer","drawElements","WebGLInfo","calls","triangles","lines","programs","autoReset","instanceCount","TRIANGLES","LINES","LINE_STRIP","LINE_LOOP","POINTS","numericalSort","absNumericalSort","WebGLMorphtargets","influencesList","morphTextures","morph","workInfluences","objectInfluences","morphTargetsCount","entry","hasMorphPosition","hasMorphNormals","hasMorphColors","morphTargets","morphNormals","morphColors","vertexDataCount","vertexDataStride","morphTarget","morphNormal","morphColor","disposeTexture","morphInfluencesSum","morphBaseInfluence","getUniforms","setValue","influences","sort","MAX_SAFE_INTEGER","WebGLObjects","updateMap","onInstancedMeshDispose","instancedMesh","buffergeometry","emptyTexture","emptyArrayTexture","empty3dTexture","emptyCubeTexture","arrayCacheF32","arrayCacheI32","mat4array","mat3array","mat2array","flatten","nBlocks","blockSize","firstElem","arraysEqual","allocTexUnits","allocateTextureUnit","setValueV1f","uniform1f","addr","setValueV2f","uniform2f","uniform2fv","setValueV3f","uniform3f","uniform3fv","setValueV4f","uniform4f","uniform4fv","setValueM2","uniformMatrix2fv","setValueM3","uniformMatrix3fv","setValueM4","uniformMatrix4fv","setValueV1i","uniform1i","setValueV2i","uniform2i","uniform2iv","setValueV3i","uniform3i","uniform3iv","setValueV4i","uniform4i","uniform4iv","setValueV1ui","uniform1ui","setValueV2ui","uniform2ui","uniform2uiv","setValueV3ui","uniform3ui","uniform3uiv","setValueV4ui","uniform4ui","uniform4uiv","setValueT1","unit","setTexture2D","setValueT3D1","setTexture3D","setValueT6","setTextureCube","setValueT2DArray1","setTexture2DArray","setValueV1fArray","uniform1fv","setValueV2fArray","setValueV3fArray","setValueV4fArray","setValueM2Array","setValueM3Array","setValueM4Array","setValueV1iArray","uniform1iv","setValueV2iArray","setValueV3iArray","setValueV4iArray","setValueV1uiArray","uniform1uiv","setValueV2uiArray","setValueV3uiArray","setValueV4uiArray","setValueT1Array","units","setValueT3DArray","setValueT6Array","setValueT2DArrayArray","SingleUniform","activeInfo","getSingularSetter","PureArrayUniform","getPureArraySetter","StructuredUniform","seq","RePathPart","addUniform","container","uniformObject","parseUniform","path","pathLength","lastIndex","matchEnd","idIsIndex","subscript","next","WebGLUniforms","getProgramParameter","ACTIVE_UNIFORMS","getActiveUniform","getUniformLocation","setOptional","WebGLShader","createShader","shaderSource","compileShader","programIdCount","getShaderErrors","status","getShaderParameter","COMPILE_STATUS","errors","getShaderInfoLog","trim","errorMatches","errorLine","toUpperCase","handleSource","split","lines2","to","join","getShaderSource","getTexelEncodingFunction","functionName","getEncodingComponents","workingPrimaries","encodingPrimaries","gamutMapping","getToneMappingFunction","toneMappingName","filterEmptyLine","replaceLightNums","numSpotLightCoords","numSpotLightShadows","numSpotLightMaps","numSpotLightShadowsWithMaps","numDirLights","numSpotLights","numRectAreaLights","numPointLights","numHemiLights","numDirLightShadows","numPointLightShadows","replaceClippingPlaneNums","numClippingPlanes","numClipIntersection","includePattern","resolveIncludes","includeReplacer","shaderChunkMap","Map","include","newInclude","unrollLoopPattern","unrollLoops","loopReplacer","snippet","generatePrecision","precisionstring","WebGLProgram","cacheKey","shadowMapTypeDefine","generateShadowMapTypeDefine","shadowMapType","envMapTypeDefine","generateEnvMapTypeDefine","envMapMode","envMapModeDefine","generateEnvMapModeDefine","envMapBlendingDefine","generateEnvMapBlendingDefine","envMapCubeUVSize","generateCubeUVSize","imageHeight","envMapCubeUVHeight","maxMip","texelHeight","texelWidth","customExtensions","generateExtensions","extensionDerivatives","normalMapTangentSpace","shaderID","extensionFragDepth","rendererExtensionFragDepth","extensionDrawBuffers","rendererExtensionDrawBuffers","extensionShaderTextureLOD","rendererExtensionShaderTextureLod","filter","customDefines","generateDefines","chunks","createProgram","prefixVertex","prefixFragment","versionString","isRawShaderMaterial","shaderType","instancing","instancingColor","useFog","fogExp2","normalMapObjectSpace","mapUv","alphaMapUv","lightMapUv","aoMapUv","emissiveMapUv","bumpMapUv","normalMapUv","displacementMapUv","metalnessMapUv","roughnessMapUv","anisotropyMapUv","clearcoatMapUv","clearcoatNormalMapUv","clearcoatRoughnessMapUv","iridescenceMapUv","iridescenceThicknessMapUv","sheenColorMapUv","sheenRoughnessMapUv","specularMapUv","specularColorMapUv","specularIntensityMapUv","transmissionMapUv","thicknessMapUv","vertexTangents","vertexAlphas","vertexUv1s","vertexUv2s","vertexUv3s","pointsUvs","skinning","morphTextureStride","doubleSided","flipSided","shadowMapEnabled","numLightProbes","useLegacyLights","decodeVideoTexture","opaque","useDepthPacking","depthPacking","vertexGlsl","fragmentGlsl","glVertexShader","glFragmentShader","onFirstUse","self","debug","checkShaderErrors","programLog","getProgramInfoLog","vertexLog","fragmentLog","runnable","haveDiagnostics","LINK_STATUS","onShaderError","vertexErrors","fragmentErrors","getError","VALIDATE_STATUS","diagnostics","prefix","deleteShader","cachedUniforms","fetchAttributeLocations","ACTIVE_ATTRIBUTES","getActiveAttrib","FLOAT_MAT2","FLOAT_MAT3","FLOAT_MAT4","getAttribLocation","attachShader","bindAttribLocation","linkProgram","programReady","rendererExtensionParallelShaderCompile","isReady","destroy","deleteProgram","usedTimes","_id$1","WebGLShaderCache","shaderCache","materialCache","vertexShaderStage","_getShaderStage","fragmentShaderStage","materialShaders","_getShaderCacheForMaterial","shaderStage","code","getVertexShaderID","getFragmentShaderID","stage","WebGLShaderStage","WebGLPrograms","_programLayers","_customShaders","IS_WEBGL2","SUPPORTS_VERTEX_TEXTURES","shaderIDs","MeshDepthMaterial","MeshDistanceMaterial","MeshNormalMaterial","MeshLambertMaterial","MeshPhongMaterial","MeshToonMaterial","MeshStandardMaterial","MeshPhysicalMaterial","MeshMatcapMaterial","LineBasicMaterial","LineDashedMaterial","PointsMaterial","ShadowMaterial","SpriteMaterial","getChannel","getParameters","shadows","isMeshStandardMaterial","customVertexShaderID","customFragmentShaderID","IS_INSTANCEDMESH","HAS_MAP","HAS_MATCAP","HAS_ENVMAP","HAS_AOMAP","HAS_LIGHTMAP","HAS_BUMPMAP","HAS_NORMALMAP","HAS_DISPLACEMENTMAP","HAS_EMISSIVEMAP","HAS_METALNESSMAP","HAS_ROUGHNESSMAP","HAS_ANISOTROPY","HAS_CLEARCOAT","HAS_IRIDESCENCE","HAS_SHEEN","HAS_TRANSMISSION","HAS_ANISOTROPYMAP","HAS_CLEARCOATMAP","HAS_CLEARCOAT_NORMALMAP","HAS_CLEARCOAT_ROUGHNESSMAP","HAS_IRIDESCENCEMAP","HAS_IRIDESCENCE_THICKNESSMAP","HAS_SHEEN_COLORMAP","HAS_SHEEN_ROUGHNESSMAP","HAS_SPECULARMAP","HAS_SPECULAR_COLORMAP","HAS_SPECULAR_INTENSITYMAP","HAS_TRANSMISSIONMAP","HAS_THICKNESSMAP","HAS_GRADIENTMAP","HAS_ALPHAMAP","HAS_ALPHATEST","HAS_ALPHAHASH","HAS_EXTENSIONS","HAS_ATTRIBUTE_UV1","HAS_ATTRIBUTE_UV2","HAS_ATTRIBUTE_UV3","isXRRenderTarget","supportsVertexTextures","isFogExp2","directional","spot","rectArea","hemi","shadowMap","_useLegacyLights","isVideoTexture","getProgramCacheKey","getProgramCacheKeyParameters","morphAttributeCount","getProgramCacheKeyBooleans","acquireProgram","pl","preexistingProgram","releaseProgram","releaseShaderCache","WebGLProperties","painterSortStable","groupOrder","reversePainterSortStable","WebGLRenderList","renderItems","renderItemsIndex","transmissive","getNextRenderItem","renderItem","finish","customOpaqueSort","customTransparentSort","WebGLRenderLists","lists","renderCallDepth","listArray","list","UniformsCache","light","halfWidth","halfHeight","nextVersion","shadowCastingAndTexturingLightsFirst","lightA","lightB","WebGLLights","shadowCache","ShadowUniformsCache","hash","directionalLength","pointLength","spotLength","rectAreaLength","hemiLength","numDirectionalShadows","numPointShadows","numSpotShadows","numSpotMaps","ambient","probe","directionalShadow","spotShadow","rectAreaLTC1","rectAreaLTC2","pointShadow","vector3","matrix42","numSpotShadowsWithMaps","scaleFactor","intensity","isAmbientLight","isLightProbe","sh","coefficients","isDirectionalLight","shadowUniforms","bias","normalBias","mapSize","isSpotLight","penumbra","updateMatrices","isRectAreaLight","isPointLight","isHemisphereLight","LTC_FLOAT_1","LTC_FLOAT_2","LTC_HALF_1","LTC_HALF_2","setupView","WebGLRenderState","lightsArray","shadowsArray","setupLights","setupLightsView","pushLight","pushShadow","shadowLight","WebGLRenderStates","renderStates","renderStateArray","renderState","isMeshDepthMaterial","isMeshDistanceMaterial","WebGLShadowMap","_objects","_capabilities","_frustum","_shadowMapSize","_viewportSize","_viewport","_depthMaterial","_distanceMaterial","_materialCache","_maxTextureSize","shadowMaterialVertical","VSM_SAMPLES","shadow_pass","resolution","shadowMaterialHorizontal","HORIZONTAL_PASS","fullScreenTri","fullScreenMesh","autoUpdate","_previousType","VSMPass","blurSamples","mapPass","renderBufferDirect","getDepthMaterial","customMaterial","customDistanceMaterial","customDepthMaterial","keyA","keyB","materialsForVariant","cachedMaterial","renderObject","shadowCamera","k","kl","depthMaterial","activeCubeFace","_state","setBlending","setTest","setScissorTest","toVSM","fromVSM","shadowFrameExtents","getFrameExtents","pars","viewportCount","getViewportCount","vp","getViewport","getFrustum","isPointLightShadow","WebGLState","colorBuffer","ColorBuffer","locked","currentColorMask","currentColorClear","setMask","colorMask","setLocked","lock","DepthBuffer","currentDepthMask","currentDepthFunc","currentDepthClear","DEPTH_TEST","depthMask","setFunc","NEVER","ALWAYS","LESS","LEQUAL","EQUAL","GEQUAL","GREATER","NOTEQUAL","clearDepth","StencilBuffer","currentStencilMask","currentStencilFunc","currentStencilRef","currentStencilFuncMask","currentStencilFail","currentStencilZFail","currentStencilZPass","currentStencilClear","stencilTest","STENCIL_TEST","stencilMask","setOp","stencilOp","clearStencil","uboBindings","uboProgramMap","enabledCapabilities","currentBoundFramebuffers","currentDrawbuffers","defaultDrawbuffers","currentProgram","currentBlendingEnabled","currentBlending","currentBlendEquation","currentBlendSrc","currentBlendDst","currentBlendEquationAlpha","currentBlendSrcAlpha","currentBlendDstAlpha","currentBlendColor","currentBlendAlpha","currentPremultipledAlpha","currentFlipSided","currentCullFace","currentLineWidth","currentPolygonOffsetFactor","currentPolygonOffsetUnits","MAX_COMBINED_TEXTURE_IMAGE_UNITS","lineWidthAvailable","glVersion","VERSION","currentTextureSlot","currentBoundTextures","scissorParam","SCISSOR_BOX","viewportParam","VIEWPORT","currentScissor","currentViewport","createTexture","dimensions","bindTexture","texParameteri","TEXTURE_MIN_FILTER","NEAREST","TEXTURE_MAG_FILTER","TEXTURE_3D","TEXTURE_2D_ARRAY","texImage2D","RGBA","texImage3D","emptyTextures","TEXTURE_2D","TEXTURE_CUBE_MAP","TEXTURE_CUBE_MAP_POSITIVE_X","setFlipSided","setCullFace","CULL_FACE","equationToGL","FUNC_ADD","FUNC_SUBTRACT","FUNC_REVERSE_SUBTRACT","MIN","MAX","MIN_EXT","MAX_EXT","factorToGL","ZERO","ONE","SRC_COLOR","SRC_ALPHA","SRC_ALPHA_SATURATE","DST_COLOR","DST_ALPHA","ONE_MINUS_SRC_COLOR","ONE_MINUS_SRC_ALPHA","ONE_MINUS_DST_COLOR","ONE_MINUS_DST_ALPHA","CONSTANT_COLOR","ONE_MINUS_CONSTANT_COLOR","CONSTANT_ALPHA","ONE_MINUS_CONSTANT_ALPHA","BLEND","blendEquationSeparate","blendFuncSeparate","blendFunc","frontFace","CW","CCW","cullFace","BACK","FRONT","FRONT_AND_BACK","setPolygonOffset","factor","POLYGON_OFFSET_FILL","bindFramebuffer","framebuffer","DRAW_FRAMEBUFFER","FRAMEBUFFER","isWebGLMultipleRenderTargets","COLOR_ATTACHMENT0","drawBuffersWEBGL","useProgram","setMaterial","frontFaceCW","SAMPLE_ALPHA_TO_COVERAGE","setLineWidth","lineWidth","SCISSOR_TEST","activeTexture","webglSlot","TEXTURE0","webglType","webglTexture","boundTexture","unbindTexture","compressedTexImage2D","compressedTexImage3D","updateUBOMapping","uniformsGroup","blockIndex","getUniformBlockIndex","uniformBlockBinding","__bindingPointIndex","texStorage2D","texStorage3D","texSubImage2D","texSubImage3D","compressedTexSubImage2D","compressedTexSubImage3D","KEEP","READ_FRAMEBUFFER","WebGLTextures","_gl","multisampledRTTExt","supportsInvalidateFramebuffer","navigator","userAgent","_videoTextures","_sources","useOffscreenCanvas","OffscreenCanvas","err","createCanvas","resizeImage","needsPowerOfTwo","needsNewCanvas","maxSize","isPowerOfTwo$1","textureNeedsGenerateMipmaps","supportsMips","generateMipmap","getInternalFormat","internalFormatName","glFormat","glType","forceLinearTransfer","RED","R32F","R16F","R8","RED_INTEGER","R8UI","R16UI","R32UI","R8I","R16I","R32I","RG","RG32F","RG16F","RG8","RGBA32F","RGBA16F","SRGB8_ALPHA8","RGBA8","UNSIGNED_SHORT_4_4_4_4","RGBA4","UNSIGNED_SHORT_5_5_5_1","RGB5_A1","getMipLevels","isFramebufferTexture","isCompressedTexture","filterFallback","LINEAR","deallocateTexture","textureProperties","__webglInit","webglTextures","__cacheKey","deleteTexture","onRenderTargetDispose","deallocateRenderTarget","renderTargetProperties","__webglTexture","__webglFramebuffer","level","deleteFramebuffer","__webglDepthbuffer","deleteRenderbuffer","__webglMultisampledFramebuffer","__webglColorRenderbuffer","__webglDepthRenderbuffer","attachmentProperties","textureUnits","slot","updateVideoTexture","__version","complete","uploadTexture","wrappingToGL","REPEAT","CLAMP_TO_EDGE","MIRRORED_REPEAT","filterToGL","NEAREST_MIPMAP_NEAREST","NEAREST_MIPMAP_LINEAR","LINEAR_MIPMAP_NEAREST","LINEAR_MIPMAP_LINEAR","compareToGL","setTextureParameters","TEXTURE_WRAP_S","TEXTURE_WRAP_T","TEXTURE_WRAP_R","compareFunction","TEXTURE_COMPARE_MODE","COMPARE_REF_TO_TEXTURE","TEXTURE_COMPARE_FUNC","__currentAnisotropy","texParameterf","TEXTURE_MAX_ANISOTROPY_EXT","initTexture","forceUpload","textureCacheKey","getTextureCacheKey","isCompressedArrayTexture","sourceProperties","texturePrimaries","unpackConversion","NONE","BROWSER_DEFAULT_WEBGL","pixelStorei","UNPACK_FLIP_Y_WEBGL","UNPACK_PREMULTIPLY_ALPHA_WEBGL","UNPACK_ALIGNMENT","UNPACK_COLORSPACE_CONVERSION_WEBGL","textureNeedsPowerOfTwo","verifyColorSpace","mipmap","glInternalFormat","useTexStorage","allocateMemory","levels","isDepthTexture","DEPTH_COMPONENT","DEPTH_COMPONENT32F","DEPTH_COMPONENT24","DEPTH24_STENCIL8","DEPTH_COMPONENT16","DEPTH_STENCIL","setupFrameBufferTexture","attachment","textureTarget","__hasExternalTextures","useMultisampledRTT","framebufferTexture2DMultisampleEXT","getRenderTargetSamples","TEXTURE_CUBE_MAP_NEGATIVE_Z","framebufferTexture2D","setupRenderBufferStorage","renderbuffer","isMultisample","bindRenderbuffer","RENDERBUFFER","renderbufferStorageMultisampleEXT","renderbufferStorageMultisample","renderbufferStorage","framebufferRenderbuffer","DEPTH_ATTACHMENT","DEPTH_STENCIL_ATTACHMENT","setupDepthRenderbuffer","isCube","__autoAllocateDepthBuffer","setupDepthTexture","webglDepthTexture","createRenderbuffer","__useRenderToTexture","sRGBToLinear","textureUnit","resetTextureUnits","uploadCubeTexture","isCompressed","cubeImage","mipmapImage","rebindTextures","colorTexture","setupRenderTarget","isMultipleRenderTargets","createFramebuffer","glTextureType","isWebGL3DRenderTarget","isWebGLArrayRenderTarget","updateRenderTargetMipmap","updateMultisampleRenderTarget","COLOR_BUFFER_BIT","invalidationArray","depthStyle","ignoreDepthValues","__ignoreDepthValues","DEPTH_BUFFER_BIT","STENCIL_BUFFER_BIT","invalidateFramebuffer","blitFramebuffer","WebGLUtils","HALF_FLOAT_OES","ALPHA","LUMINANCE","LUMINANCE_ALPHA","SRGB_ALPHA_EXT","RG_INTEGER","RGBA_INTEGER","COMPRESSED_SRGB_S3TC_DXT1_EXT","COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT","COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT","COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT","COMPRESSED_RGB_S3TC_DXT1_EXT","COMPRESSED_RGBA_S3TC_DXT1_EXT","COMPRESSED_RGBA_S3TC_DXT3_EXT","COMPRESSED_RGBA_S3TC_DXT5_EXT","COMPRESSED_RGB_PVRTC_4BPPV1_IMG","COMPRESSED_RGB_PVRTC_2BPPV1_IMG","COMPRESSED_RGBA_PVRTC_4BPPV1_IMG","COMPRESSED_RGBA_PVRTC_2BPPV1_IMG","COMPRESSED_RGB_ETC1_WEBGL","COMPRESSED_SRGB8_ETC2","COMPRESSED_RGB8_ETC2","COMPRESSED_SRGB8_ALPHA8_ETC2_EAC","COMPRESSED_RGBA8_ETC2_EAC","COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR","COMPRESSED_RGBA_ASTC_4x4_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR","COMPRESSED_RGBA_ASTC_5x4_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR","COMPRESSED_RGBA_ASTC_5x5_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR","COMPRESSED_RGBA_ASTC_6x5_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR","COMPRESSED_RGBA_ASTC_6x6_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR","COMPRESSED_RGBA_ASTC_8x5_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR","COMPRESSED_RGBA_ASTC_8x6_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR","COMPRESSED_RGBA_ASTC_8x8_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR","COMPRESSED_RGBA_ASTC_10x5_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR","COMPRESSED_RGBA_ASTC_10x6_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR","COMPRESSED_RGBA_ASTC_10x8_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR","COMPRESSED_RGBA_ASTC_10x10_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR","COMPRESSED_RGBA_ASTC_12x10_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR","COMPRESSED_RGBA_ASTC_12x12_KHR","COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT","COMPRESSED_RGBA_BPTC_UNORM_EXT","COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT","COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT","COMPRESSED_RED_RGTC1_EXT","COMPRESSED_SIGNED_RED_RGTC1_EXT","COMPRESSED_RED_GREEN_RGTC2_EXT","COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT","UNSIGNED_INT_24_8","UNSIGNED_INT_24_8_WEBGL","ArrayCamera","isArrayCamera","Group","isGroup","_moveEvent","WebXRController","_targetRay","_grip","_hand","getHandSpace","joints","inputState","pinching","getTargetRaySpace","hasLinearVelocity","linearVelocity","hasAngularVelocity","angularVelocity","getGripSpace","connect","inputSource","hand","inputjoint","_getHandJoint","disconnect","referenceSpace","inputPose","gripPose","handPose","targetRay","grip","session","visibilityState","jointPose","getJointPose","joint","transform","jointRadius","indexTip","thumbTip","distanceToPinch","threshold","handedness","gripSpace","getPose","targetRaySpace","jointName","DepthTexture","WebXRManager","framebufferScaleFactor","referenceSpaceType","foveation","customReferenceSpace","pose","glBinding","glProjLayer","glBaseLayer","xrFrame","getContextAttributes","initialRenderTarget","newRenderTarget","controllers","controllerInputSources","cameraL","cameraR","cameraXR","_currentDepthNear","_currentDepthFar","onSessionEvent","controllerIndex","controller","onSessionEnd","onInputSourcesChange","isPresenting","removed","added","cameraAutoUpdate","getController","getControllerGrip","getHand","setFramebufferScaleFactor","setReferenceSpaceType","getReferenceSpace","setReferenceSpace","space","getBaseLayer","getBinding","getFrame","getSession","setSession","async","xrCompatible","makeXRCompatible","layerInit","antialias","XRWebGLLayer","updateRenderState","baseLayer","framebufferWidth","framebufferHeight","depthFormat","depthType","glDepthFormat","projectionlayerInit","colorFormat","XRWebGLBinding","createProjectionLayer","textureWidth","textureHeight","setFoveation","requestReferenceSpace","cameraLPos","cameraRPos","updateCamera","depthNear","depthFar","setProjectionFromUnion","ipd","projL","projR","topFov","bottomFov","leftFov","rightFov","zOffset","xOffset","near2","far2","left2","right2","top2","bottom2","updateUserCamera","getCamera","getFoveation","fixedFoveation","onAnimationFrameCallback","getViewerPose","views","setRenderTargetFramebuffer","cameraXRNeedsUpdate","glSubImage","getViewSubImage","setRenderTargetTextures","depthStencilTexture","detectedPlanes","WebGLMaterials","refreshTransformUniform","refreshUniformsCommon","refreshFogUniforms","isFog","density","refreshMaterialUniforms","pixelRatio","transmissionRenderTarget","isMeshLambertMaterial","isMeshToonMaterial","refreshUniformsToon","isMeshPhongMaterial","refreshUniformsPhong","refreshUniformsStandard","isMeshPhysicalMaterial","refreshUniformsPhysical","isMeshMatcapMaterial","refreshUniformsMatcap","refreshUniformsDistance","isMeshNormalMaterial","isLineBasicMaterial","refreshUniformsLine","isLineDashedMaterial","refreshUniformsDash","isPointsMaterial","refreshUniformsPoints","isSpriteMaterial","refreshUniformsSprites","isShadowMaterial","WebGLUniformsGroups","updateList","allocatedBindingPoints","maxBindingPoints","MAX_UNIFORM_BUFFER_BINDINGS","hasUniformChanged","tempValues","cachedObjects","cachedObject","getUniformSize","boundary","storage","onUniformsGroupsDispose","webglProgram","prepareUniformsGroup","chunkSize","chunkOffset","infos","__data","__offset","remainingSizeInChunk","__size","__cache","bindingPointIndex","allocateBindingPointIndex","UNIFORM_BUFFER","bindBufferBase","updateBufferData","arrayOffset","WebGLRenderer","preserveDrawingBuffer","powerPreference","failIfMajorPerformanceCaveat","_alpha","isWebGLRenderer","uintClearColor","intClearColor","currentRenderList","currentRenderState","renderListStack","renderStateStack","domElement","sortObjects","_outputColorSpace","toneMappingExposure","_this","_isContextLost","_currentActiveCubeFace","_currentActiveMipmapLevel","_currentRenderTarget","_currentMaterialId","_currentCamera","_currentViewport","_currentScissor","_currentScissorTest","_currentClearColor","_currentClearAlpha","_width","_height","_pixelRatio","_opaqueSort","_transparentSort","_scissor","_scissorTest","_clippingEnabled","_localClippingEnabled","_transmissionRenderTarget","_projScreenMatrix","_vector3","_emptyScene","overrideMaterial","getTargetPixelRatio","programCache","renderLists","morphtargets","bufferRenderer","indexedBufferRenderer","contextNames","contextAttributes","contextName","onContextLost","onContextRestore","onContextCreationError","isWebGL1Renderer","shift","WebGLRenderingContext","rangeMin","rangeMax","initGLContext","preventDefault","infoAutoReset","shadowMapAutoUpdate","shadowMapNeedsUpdate","statusMessage","onMaterialDispose","deallocateMaterial","releaseMaterialProgramReferences","forEach","prepareMaterial","getProgram","forceContextLoss","loseContext","forceContextRestore","restoreContext","getPixelRatio","setPixelRatio","updateStyle","setViewport","getDrawingBufferSize","setDrawingBufferSize","getCurrentViewport","getScissor","setScissor","getScissorTest","boolean","setOpaqueSort","method","setTransparentSort","bits","isIntegerFormat","targetFormat","targetType","isUnsignedType","clearBufferuiv","COLOR","clearBufferiv","onXRSessionStart","onXRSessionEnd","setProgram","needsProgramChange","needsLights","lightsStateVersion","refreshProgram","refreshMaterial","refreshLights","p_uniforms","m_uniforms","uCamPos","cameraPosition","boneTexture","computeBoneTexture","boneTextureSize","isMeshGouraudMaterial","markUniformsLightsNeedsUpdate","upload","getUniformList","rangeFactor","drawStart","drawEnd","drawCount","isLineSegments","isLineLoop","isSprite","maxInstanceCount","targetScene","material2","compileAsync","checkMaterialsReady","setTimeout","projectObject","isLOD","renderScene","opaqueObjects","transmissiveObjects","transparentObjects","renderTransmissionPass","currentToneMapping","renderObjects","renderTargetNeedsUpdate","currentSide","programCacheKey","updateCommonMaterialProperties","materialNeedsLights","uniformsList","progUniforms","seqWithValue","camera2","defaultFramebuffer","__useDefaultFramebuffer","useDefaultFramebuffer","isRenderTarget3D","layer","framebufferTextureLayer","readRenderTargetPixels","activeCubeFaceIndex","textureFormat","IMPLEMENTATION_COLOR_READ_FORMAT","halfFloatSupportedByExt","IMPLEMENTATION_COLOR_READ_TYPE","readPixels","copyFramebufferToTexture","levelScale","copyTexSubImage2D","copyTextureToTexture","srcTexture","dstTexture","copyTextureToTexture3D","sourceBox","glTarget","unpackRowLen","UNPACK_ROW_LENGTH","unpackImageHeight","UNPACK_IMAGE_HEIGHT","unpackSkipPixels","UNPACK_SKIP_PIXELS","unpackSkipRows","UNPACK_SKIP_ROWS","unpackSkipImages","UNPACK_SKIP_IMAGES","resetState","__THREE_DEVTOOLS__","CustomEvent","detail","drawingBufferColorSpace","unpackColorSpace","physicallyCorrectLights","outputEncoding","WebGL1Renderer","Scene","InterleavedBuffer","isInterleavedBuffer","arrayBuffers","_uuid","ib","_vector$5","InterleavedBufferAttribute","interleavedBuffer","interleavedBuffers","_geometry","_intersectPoint","_worldScale","_mvPosition","_alignedPosition","_rotatedPosition","_viewWorldMatrix","_vA","_vB","_vC","_uvA","_uvB","_uvC","Sprite","float32Array","transformVertex","vertexPosition","mvPosition","_basePosition","_skinIndex","_skinWeight","_matrix4","_vertex","_sphere$3","_inverseMatrix$2","_ray$2","SkinnedMesh","bindMatrixInverse","applyBoneTransform","calculateInverses","normalizeSkinWeights","skinWeight","skinIndex","boneIndex","bones","boneInverses","boneTransform","Bone","isBone","DataTexture","_offsetMatrix","_identityMatrix","Skeleton","boneMatrices","inverse","bone","getBoneByName","fromJSON","json","boneInverse","InstancedBufferAttribute","_instanceLocalMatrix","_instanceWorldMatrix","_instanceIntersects","_box3","_identity","_mesh","_sphere$2","InstancedMesh","setMatrixAt","getMatrixAt","getColorAt","raycastTimes","instanceId","setColorAt","linecap","linejoin","_start$1","_end$1","_inverseMatrix$1","_ray$1","_sphere$1","Line","computeLineDistances","lineDistances","localThreshold","localThresholdSq","vStart","vEnd","interSegment","interRay","_start","_end","LineSegments","LineLoop","_inverseMatrix","_ray","_sphere","_position$2","Points","testPoint","rayPointDistanceSq","intersectPoint","distanceToRay","CanvasTexture","isCanvasTexture","CubicPoly","c0","initCatmullRom","x3","tension","initNonuniformCatmullRom","dt0","dt1","dt2","t2","calc","px","py","pz","CatmullRomCurve3","Curve","arcLengthDivisions","getPoint","getPointAt","optionalTarget","getUtoTmapping","getPoints","divisions","getSpacedPoints","getLength","lengths","getLengths","cacheArcLengths","current","last","updateArcLengths","arcLengths","targetArcLength","comparison","lengthBefore","getTangent","pt1","pt2","getTangentAt","computeFrenetFrames","segments","closed","binormals","vec","mat","MAX_VALUE","curveType","isCatmullRomCurve3","intPoint","PolyhedronGeometry","vertexBuffer","uvBuffer","subdivideFace","cols","aj","bj","rows","pushVertex","vertex","getVertexByIndex","correctUV","azimuth","subdivide","applyRadius","generateUVs","correctUVs","centroid","azi","correctSeam","details","OctahedronGeometry","SphereGeometry","phiStart","phiLength","thetaStart","thetaLength","thetaEnd","grid","verticesRow","uOffset","STANDARD","PHYSICAL","_anisotropy","_clearcoat","_iridescence","_sheen","_transmission","convertArray","forceClone","getKeyframeOrder","times","compareTime","sortedArray","nValues","srcOffset","flattenJSON","jsonKeys","valuePropertyName","Interpolant","parameterPositions","sampleValues","sampleSize","resultBuffer","_cachedIndex","valueSize","settings","DefaultSettings_","evaluate","pp","validate_interval","seek","linear_scan","forward_scan","giveUpAt","copySampleValue_","t1global","mid","intervalChanged_","interpolate_","getSettings_","CubicInterpolant","_weightPrev","_offsetPrev","_weightNext","_offsetNext","endingStart","endingEnd","iPrev","iNext","tPrev","tNext","halfDt","o1","o0","oP","oN","wP","wN","ppp","sP","sN","LinearInterpolant","offset1","offset0","weight1","weight0","DiscreteInterpolant","KeyframeTrack","interpolation","TimeBufferType","ValueBufferType","setInterpolation","DefaultInterpolation","track","trackType","ValueTypeName","InterpolantFactoryMethodDiscrete","getValueSize","InterpolantFactoryMethodLinear","InterpolantFactoryMethodSmooth","factoryMethod","createInterpolant","timeOffset","timeScale","startTime","endTime","nKeys","validate","valid","prevTime","currTime","isTypedArray","isView","DataView","optimize","smoothInterpolation","writeIndex","keep","offsetP","offsetN","readOffset","writeOffset","TypedKeyframeTrack","BooleanKeyframeTrack","ColorKeyframeTrack","NumberKeyframeTrack","QuaternionLinearInterpolant","slerpFlat","QuaternionKeyframeTrack","StringKeyframeTrack","VectorKeyframeTrack","AnimationClip","duration","tracks","blendMode","resetDuration","jsonTracks","frameTime","fps","parseKeyframeTrack","clip","clipTracks","morphTargetSequence","noLoop","numMorphTargets","objectOrClipArray","clipArray","o","animationToMorphTargets","pattern","parts","animationMorphTargets","clips","CreateFromMorphTargetSequence","addNonemptyTrack","trackName","animationKeys","propertyName","destTracks","clipName","hierarchyTracks","hierarchy","morphTargetNames","morphTargetName","animationKey","boneName","getTrackTypeForValueTypeName","typeName","Cache","files","LoadingManager","onLoad","onProgress","onError","urlModifier","isLoading","itemsLoaded","itemsTotal","handlers","onStart","itemStart","itemEnd","itemError","resolveURL","setURLModifier","addHandler","regex","removeHandler","getHandler","global","DefaultLoadingManager","Loader","manager","withCredentials","resourcePath","requestHeader","loadAsync","setCrossOrigin","setWithCredentials","setPath","setResourcePath","setRequestHeader","DEFAULT_MATERIAL_NAME","loading","HttpError","response","FileLoader","req","Request","headers","Headers","credentials","mimeType","responseType","fetch","then","ReadableStream","body","getReader","callbacks","reader","contentLength","total","lengthComputable","loaded","stream","readData","read","done","close","byteLength","ProgressEvent","enqueue","Response","statusText","arrayBuffer","blob","text","DOMParser","parseFromString","label","decoder","TextDecoder","decode","catch","finally","setResponseType","setMimeType","ImageLoader","onImageLoad","removeEventListeners","onImageError","CubeTextureLoader","urls","loadTexture","DataTextureLoader","texData","mipmapCount","TextureLoader","Light","HemisphereLight","_projScreenMatrix$1","_lightPositionWorld$1","_lookTarget$1","LightShadow","_frameExtents","_viewportCount","_viewports","shadowMatrix","viewportIndex","SpotLightShadow","isSpotLightShadow","SpotLight","power","_lightPositionWorld","_lookTarget","PointLightShadow","_cubeDirections","_cubeUps","PointLight","DirectionalLightShadow","isDirectionalLightShadow","DirectionalLight","LoaderUtils","fromCharCode","decodeURIComponent","escape","lastIndexOf","InstancedBufferGeometry","BufferGeometryLoader","interleavedBufferMap","arrayBufferMap","getInterleavedBuffer","getArrayBuffer","typedArray","bufferAttribute","drawcalls","offsets","ImageBitmapLoader","isImageBitmapLoader","createImageBitmap","setOptions","fetchOptions","res","colorSpaceConversion","imageBitmap","Clock","autoStart","oldTime","elapsedTime","running","now","getElapsedTime","getDelta","diff","newTime","performance","Date","PropertyMixer","binding","mixFunction","mixFunctionAdditive","setIdentity","_slerp","_slerpAdditive","_setAdditiveIdentityQuaternion","_workIndex","_select","_setAdditiveIdentityOther","_lerp","_lerpAdditive","_setAdditiveIdentityNumeric","_mixBufferRegion","_mixBufferRegionAdditive","_setIdentity","_origIndex","_addIndex","cumulativeWeight","cumulativeWeightAdditive","useCount","referenceCount","accumulate","accuIndex","currentWeight","mix","accumulateAdditive","weightAdditive","originalValueOffset","saveOriginalState","getValue","restoreOriginalState","startIndex","endIndex","targetIndex","workOffset","multiplyQuaternionsFlat","_reservedRe","RegExp","_wordCharOrDot","_trackRe","_supportedObjectNames","PropertyBinding","rootNode","parsedPath","parseTrackName","findNode","nodeName","_getValue_unbound","_setValue_unbound","root","isAnimationObjectGroup","Composite","matches","results","objectName","objectIndex","propertyIndex","lastDot","substring","searchNodeSubtree","childNode","subTreeNode","_getValue_unavailable","_setValue_unavailable","_getValue_direct","targetObject","_getValue_array","resolvedProperty","_getValue_arrayElement","_getValue_toArray","_setValue_direct","_setValue_direct_setNeedsUpdate","_setValue_direct_setMatrixWorldNeedsUpdate","_setValue_array","dest","_setValue_array_setNeedsUpdate","_setValue_array_setMatrixWorldNeedsUpdate","_setValue_arrayElement","_setValue_arrayElement_setNeedsUpdate","_setValue_arrayElement_setMatrixWorldNeedsUpdate","_setValue_fromArray","_setValue_fromArray_setNeedsUpdate","_setValue_fromArray_setMatrixWorldNeedsUpdate","targetArray","sourceArray","nodeProperty","versioning","Versioning","None","NeedsUpdate","MatrixWorldNeedsUpdate","bindingType","BindingType","Direct","ArrayElement","HasFromToArray","EntireArray","GetterByBindingType","SetterByBindingTypeAndVersioning","unbind","targetGroup","optionalParsedPath","_targetGroup","_bindings","subscribe_","firstValidIndex","nCachedObjects_","bindings","AnimationAction","mixer","localRoot","_mixer","_clip","_localRoot","nTracks","interpolants","interpolantSettings","interpolant","_interpolantSettings","_interpolants","_propertyBindings","_cacheIndex","_byClipCacheIndex","_timeScaleInterpolant","_weightInterpolant","loop","_loopCount","_startTime","_effectiveTimeScale","_effectiveWeight","repetitions","paused","clampWhenFinished","zeroSlopeAtStart","zeroSlopeAtEnd","play","_activateAction","_deactivateAction","stopFading","stopWarping","isRunning","_isActiveAction","isScheduled","startAt","setLoop","setEffectiveWeight","getEffectiveWeight","fadeIn","_scheduleFading","fadeOut","crossFadeFrom","fadeOutAction","warp","fadeInDuration","fadeOutDuration","startEndRatio","endStartRatio","crossFadeTo","fadeInAction","weightInterpolant","_takeBackControlInterpolant","setEffectiveTimeScale","getEffectiveTimeScale","setDuration","syncWith","action","halt","startTimeScale","endTimeScale","_lendControlInterpolant","timeScaleInterpolant","getMixer","getClip","getRoot","_root","_update","deltaTime","timeDirection","_updateWeight","timeRunning","_updateTimeScale","clipTime","_updateTime","propertyMixers","interpolantValue","loopCount","pingPong","_setEndings","handle_stop","loopDelta","pending","atStart","atEnd","weightNow","weightThen","_controlInterpolantsResultBuffer","AnimationMixer","_initMemoryManager","_accuIndex","_bindAction","prototypeAction","rootUuid","bindingsByRoot","_bindingsByRootAndName","bindingsByName","_addInactiveBinding","create","clipUuid","actionsForClip","_actionsByClip","knownActions","_addInactiveAction","_lendBinding","_lendAction","_takeBackBinding","_takeBackAction","_actions","_nActiveActions","_nActiveBindings","_controlInterpolants","_nActiveControlInterpolants","stats","actions","inUse","controlInterpolants","actionsByClip","actionByRoot","_removeInactiveAction","lastInactiveAction","cacheIndex","knownActionsForClip","lastKnownAction","byClipCacheIndex","_removeInactiveBindingsForAction","_removeInactiveBinding","prevIndex","lastActiveIndex","firstInactiveAction","firstInactiveIndex","lastActiveAction","bindingByName","propBinding","lastInactiveBinding","firstInactiveBinding","lastActiveBinding","__cacheIndex","lastActiveInterpolant","clipAction","optionalRoot","clipObject","findByName","existingAction","newAction","stopAllAction","nActions","nBindings","setTime","timeInSeconds","uncacheClip","actionsToRemove","uncacheRoot","uncacheAction","Raycaster","LOD","setFromCamera","coords","intersectObject","ascSort","intersectObjects","toTrianglesDrawMode","drawMode","numberOfTriangles","newIndices","newGeometry","revision","window","__THREE__","GLTFLoader","dracoLoader","ktx2Loader","meshoptDecoder","pluginCallbacks","register","parser","GLTFMaterialsClearcoatExtension","GLTFTextureBasisUExtension","GLTFTextureWebPExtension","GLTFTextureAVIFExtension","GLTFMaterialsSheenExtension","GLTFMaterialsTransmissionExtension","GLTFMaterialsVolumeExtension","GLTFMaterialsIorExtension","GLTFMaterialsEmissiveStrengthExtension","GLTFMaterialsSpecularExtension","GLTFMaterialsIridescenceExtension","GLTFMaterialsAnisotropyExtension","GLTFLightsExtension","GLTFMeshoptCompression","GLTFMeshGpuInstancing","extractUrlBase","_onError","setDRACOLoader","setDDSLoader","setKTX2Loader","setMeshoptDecoder","unregister","plugins","textDecoder","BINARY_EXTENSION_HEADER_MAGIC","EXTENSIONS","KHR_BINARY_GLTF","GLTFBinaryExtension","content","asset","GLTFParser","fileLoader","plugin","extensionsUsed","extensionName","extensionsRequired","KHR_MATERIALS_UNLIT","GLTFMaterialsUnlitExtension","KHR_DRACO_MESH_COMPRESSION","GLTFDracoMeshCompressionExtension","KHR_TEXTURE_TRANSFORM","GLTFTextureTransformExtension","KHR_MESH_QUANTIZATION","GLTFMeshQuantizationExtension","setExtensions","setPlugins","parseAsync","GLTFRegistry","removeAll","KHR_LIGHTS_PUNCTUAL","KHR_MATERIALS_CLEARCOAT","KHR_MATERIALS_IOR","KHR_MATERIALS_SHEEN","KHR_MATERIALS_SPECULAR","KHR_MATERIALS_TRANSMISSION","KHR_MATERIALS_IRIDESCENCE","KHR_MATERIALS_ANISOTROPY","KHR_MATERIALS_VOLUME","KHR_TEXTURE_BASISU","KHR_MATERIALS_EMISSIVE_STRENGTH","EXT_TEXTURE_WEBP","EXT_TEXTURE_AVIF","EXT_MESHOPT_COMPRESSION","EXT_MESH_GPU_INSTANCING","refs","uses","_markDefs","nodeDefs","nodeIndex","nodeLength","nodeDef","_addNodeRef","_loadLight","lightIndex","dependency","lightDef","lightNode","innerConeAngle","outerConeAngle","assignExtrasToUserData","createUniqueName","getDependency","createNodeAttachment","_getNodeRef","getMaterialType","extendParams","materialParams","materialDef","metallicRoughness","pbrMetallicRoughness","baseColorFactor","baseColorTexture","assignTexture","all","extendMaterialParams","emissiveStrength","clearcoatFactor","clearcoatTexture","clearcoatRoughnessFactor","clearcoatRoughnessTexture","clearcoatNormalTexture","iridescenceFactor","iridescenceTexture","iridescenceIor","iridescenceThicknessTexture","sheenColorFactor","colorFactor","sheenRoughnessFactor","sheenColorTexture","sheenRoughnessTexture","transmissionFactor","transmissionTexture","thicknessFactor","thicknessTexture","colorArray","specularFactor","specularTexture","specularColorFactor","specularColorTexture","anisotropyStrength","anisotropyTexture","textureIndex","textureDef","loadTextureImage","isSupported","textureLoader","uri","handler","detectSupport","loadBufferView","bufferView","bufferViews","extensionDef","supported","byteOffset","byteStride","decodeGltfBufferAsync","ready","decodeGltfBuffer","createNodeMesh","meshDef","meshes","primitive","primitives","WEBGL_CONSTANTS","TRIANGLE_STRIP","TRIANGLE_FAN","attributesDef","accessor","nodeObject","instancedMeshes","TRANSLATION","ROTATION","SCALE","attributeName","attr","assignFinalMaterial","BINARY_EXTENSION_CHUNK_TYPES","headerView","header","magic","getUint32","chunkContentsLength","chunkView","chunkIndex","chunkLength","chunkType","contentArray","preload","decodePrimitive","bufferViewIndex","gltfAttributeMap","threeAttributeMap","attributeNormalizedMap","attributeTypeMap","threeAttributeName","ATTRIBUTES","accessorDef","accessors","componentType","WEBGL_COMPONENT_TYPES","decodeDracoFile","extendTexture","texCoord","GLTFCubicSplineInterpolant","stride2","stride3","td","m0","m1","_q","GLTFCubicSplineQuaternionInterpolant","FLOAT_VEC2","FLOAT_VEC3","FLOAT_VEC4","SAMPLER_2D","WEBGL_FILTERS","WEBGL_WRAPPINGS","WEBGL_TYPE_SIZES","SCALAR","VEC2","VEC3","VEC4","MAT2","MAT3","MAT4","POSITION","NORMAL","TANGENT","TEXCOORD_0","TEXCOORD_1","TEXCOORD_2","TEXCOORD_3","COLOR_0","WEIGHTS_0","JOINTS_0","PATH_PROPERTIES","translation","INTERPOLATION","CUBICSPLINE","STEP","ALPHA_MODES","addUnknownExtensionsToUserData","knownExtensions","objectDef","gltfExtensions","gltfDef","extras","targetNames","createPrimitiveKey","primitiveDef","geometryKey","dracoExtension","createAttributesKey","targets","attributesKey","getNormalizedComponentScale","associations","primitiveCache","nodeCache","meshCache","cameraCache","lightCache","sourceCache","textureCache","nodeNamesUsed","isSafari","isFirefox","firefoxVersion","_invokeAll","ext","beforeRoot","getDependencies","dependencies","scenes","afterRoot","skinDefs","skins","meshDefs","skinLength","skin","ref","updateMappings","original","mappings","_invokeOne","func","loadScene","loadNode","loadMesh","loadAccessor","loadBuffer","loadMaterial","loadSkin","loadAnimation","loadCamera","defs","def","bufferIndex","bufferDef","bufferViewDef","accessorIndex","sparse","TypedArray","pendingBufferViews","elementBytes","itemBytes","ibSlice","ibCacheKey","itemSizeIndices","TypedArrayIndices","byteOffsetIndices","byteOffsetValues","sparseIndices","sparseValues","sourceIndex","sourceDef","sampler","promise","loadImageSource","startsWith","samplers","URL","webkitURL","sourceURI","isObjectURL","Blob","createObjectURL","revokeObjectURL","getImageURIMimeType","search","mapName","mapDef","gltfReference","useDerivativeTangents","useVertexColors","useFlatShading","pointsMaterial","lineMaterial","materialType","kmuExtension","metallicFactor","roughnessFactor","metallicRoughnessTexture","alphaMode","alphaCutoff","normalTexture","occlusionTexture","strength","emissiveFactor","emissiveTexture","originalName","sanitizedName","sanitizeNodeName","loadGeometries","createDracoPrimitive","addPrimitiveAttributes","geometryPromise","meshIndex","cameraIndex","cameraDef","yfov","aspectRatio","znear","zfar","xmag","ymag","skinDef","_loadNodeShallow","inverseBindMatrices","jointNodes","jointNode","animationIndex","animationDef","animationName","pendingNodes","pendingInputAccessors","pendingOutputAccessors","pendingSamplers","pendingTargets","channels","input","inputAccessors","outputAccessors","inputAccessor","outputAccessor","createdTracks","_createAnimationTracks","nodePending","childPending","childrenDef","skeletonPending","meshPromise","sceneIndex","sceneDef","nodeIds","reducedAssociations","reduceAssociations","targetName","outputArray","_getArrayFromAccessor","_createCubicSplineTrackInterpolant","scaled","InterpolantFactoryMethodGLTFCubicSpline","isInterpolantFactoryMethodGLTFCubicSpline","assignAttributeAccessor","gltfAttributeName","computeBounds","boxScale","maxDisplacement","addMorphTargets","hasMorphNormal","hasMorphColor","pendingPositionAccessors","pendingNormalAccessors","pendingColorAccessors","pendingAccessor","morphPositions","baseScale","preferredSystem","preferredColorset","cache_hits","cache_misses","loaderGLTF","fontLoadingPromises","baseTextureCache","systems","i18n","localize","dice","spectrum","foundry_vtt","dot_b","preset","addDicePreset","CONFIG","Dice","terms","Coin","FateDie","Die","objTerm","internalAddDicePreset","initializeMaterials","material_options","plastic","scopedOptions","glass","chrome","pristine","setScale","setQualitySettings","config","bumpMapping","aa","antialiasing","glow","useHighDPI","shadowQuality","findIndex","el","waitForLoad","userID","activePresets","preloadPresetsByUser","user","getFlag","duplicate","obj","hasOwnProperty","getPresetBySystem","users","promiseArray","addSystem","find","substr","FontConfig","getAvailableFonts","loadFont","editor","fonts","DENOMINATION","getResultLabel","disposeCachedMaterials","timeout","race","scopedTextureCache","isGhost","dicemesh","scopedScale","geom","createGeometry","cannon_shape","THREE.AnimationMixer","materialData","generateMaterialData","baseTextureCacheString","cacheString","createMaterials","THREE.Mesh","THREE.Color","rerolls","resultReason","factory","getFaceValue","closest_face","reason","THREE.Vector3","faceCannon","closest_angle","body_sim","faceNormals","notation","dieValue","labelIndex","storeRolledValue","getLastValue","setLastValue","dice_texture","materialSelected","THREE.MeshPhongMaterial","THREE.MeshStandardMaterial","THREE.MeshLambertMaterial","THREE.MeshPhysicalMaterial","textureCube","createElement","globalAlpha","canvasBump","contextBump","canvasEmissive","contextEmissive","labelsTotal","isHeritedFromShape","texturesPerLine","sizeTexture","ts","calc_texture_size","texturesOnThisLine","createTextMaterial","startI","THREE.CanvasTexture","needUpdate","forecolor","outlinecolor","backcolor","fillStyle","fillRect","save","beginPath","rect","globalCompositeOperation","restore","textAlign","textBaseline","shadowColor","shadowOffsetX","shadowOffsetY","shadowBlur","fontsize","textstarty","textstartx","lineHeight","textlines","pixiStyle","PIXI","TextStyle","fontFamily","fontSize","stroke","strokeThickness","TextMetrics","measureText","textline","strokeStyle","strokeText","fillText","hw","hh","wShift","hShift","destX","destY","textureSize","getAppearanceForDice","appearances","dicetype","dicenotation","colorsetData","getColorSet","opt","flavor","ghost","colorindex","baseTexture","approx","typeScale","create_d2_geometry","create_d4_geometry","create_d6_geometry","create_d8_geometry","create_d10_geometry","create_d12_geometry","create_d14_geometry","create_d16_geometry","create_d20_geometry","create_d24_geometry","create_d30_geometry","load_geometry","bufferGeometry","THREE.BufferGeometryLoader","CANNON","Cylinder","create_geom","create_geom_dcc","create_shape","cv","Vec3","ConvexPolyhedron","vectors","create_shape_dcc","DiceSFX","nameLocalized","_name","isGlobal","muteSound","destroyed","enableGC","renderReady","volume","secretRoll","muteSoundSecretRolls","sfxLine","dialogContent","disabled","isGM","PlaySoundEpicFail","audio","AudioHelper","preloadSound","PlaySoundEpicWin","Proton","preParticles","integrationType","Util","initValue","POOL_MAX","EULER","emitters","renderers","pool","Pool","integrator","Integration","initialize","TIME_STEP","DR","MEASURE","RK2","RK4","VERLET","PARTICLE_CREATED","PARTICLE_UPDATE","PARTICLE_SLEEP","PARTICLE_DEAD","PROTON_UPDATE","PROTON_UPDATE_AFTER","EMITTER_ADDED","EMITTER_REMOVED","bindEmtterEvent","addRender","removeRender","addEmitter","emitter","removeEmitter","$delta","getCount","particles","removeAllEventListeners","arr","eventName","eventTarget","ret","defaults","destroyArray","destroyObject","isUndefined","arg","setVectorByObj","pOBJ","setPrototypeByObj","proObj","filters","_getValue","pan","Span","inherits","subClass","superClass","_super_","F","ColorUtil","store","THREEUtil","toScreenPos","pos","toSpacePos","img","THREE.Texture","PUID","_id","_uids","nid","str","Particle","ID","cID","getDirection","life","age","energy","dead","sleep","useColor","useAlpha","easing","ease","setEasingByName","easeLinear","Vector3D","old","behaviours","removeAllBehaviours","applyBehaviour","addBehaviour","behaviour","addBehaviours","removeBehaviour","puid","__puid","expire","_getList","uid","randomAToB","randomFloating","randomZone","degreeTransform","toColor16","num","axisRotate","tha","addValue","integrate","damping","particle","getGradient","eulerFromDir","iz","iw","Polar3D","_isArray","ArraySpan","colors","_arr","setRadius","setPhi","setTheta","toVector3D","createSpan","createArraySpan","Box","Behaviour","Rate","numPan","timePan","nextTime","Initialize","contains","normalizeForce","normalizeValue","InitializeUtil","initializes","bindEmitter","Life","lifePan","Position","Velocity","dirVec","Mass","massPan","Radius","Body","Force","fx","fy","fz","Attraction","targetPosition","radiusSq","attractionForce","RandomDrift","driftX","driftY","driftZ","delay","Repulsion","Gravity","Collision","useMass","CrossZone","Alpha","Scale","Rotate","Spring","spring","friction","Emitter","pObj","currentEmitTime","totalEmitTimes","rate","BehaviourEmitter","selfBehaviours","FollowEmitter","mouseTarget","_allowEmitting","mouse","initEventHandler","zones","args","addZone","zone","getPosition","P","radiusPan","_useV","vr","V","oldRadius","randomFoce","delayPan","G","otherParticle","overlap","averageMass1","averageMass2","_getAverageMass","aPartcile","bParticle","crossType","crossing","_same","alphaA","alphaB","scaleA","scaleB","_type","_setRotation","fR","tR","addR","vec3","colorA","colorB","emit","stopEmit","removeAllParticles","createParticle","setupParticle","addSelfInitialize","initAll","addInitialize","removeInitialize","initializer","removeInitializers","emitting","addSelfBehaviour","removeSelfBehaviour","mousemoveHandler","mousemove","mousedownHandler","mousedown","mouseupHandler","mouseup","setCameraAndCanvas","setCameraAndRenderer","getBoundingClientRect","clientX","clientY","ratio","vec2","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInBack","easeOutBack","easeInOutBack","easeName","BaseRender","MeshRender","_targetPool","_materialPool","_body","THREE.BoxGeometry","PointsRender","ps","SpriteRender","THREE.Sprite","THREE.SpriteMaterial","CustomRender","targetPool","materialPool","Zone","LineZone","SphereZone","MeshZone","toBufferGeometry","PointZone","BoxZone","ScreenZone","dis","proton","onProtonUpdate","onParticleCreated","onParticleUpdate","onParticleDead","_bound","_cross","_dead","rVector","_static","once","Debug","fun","drawZone","THREE.SphereGeometry","THREE.MeshBasicMaterial","drawEmitter","THREE.OctahedronGeometry","renderInfo","getCreatedNumber","addInfo","_infoType","getEmitterPos","_infoCon","innerHTML","bg","cssText","parentNode","appendChild","PlayAnimationParticleSpiral","loadAsset","DiceSFXManager","sound","R","emitter1","createEmitter","emitter2","animateEmitter","PlayAnimationParticleSparkles","THREE.Box3","PlayAnimationParticleVortex","THREE.PlaneGeometry","dicefactory","PlayAnimationBright","brightColor","glowingMesh","clock","THREE.Clock","baseColor","baseMaterial","sfxMaterial","PlayAnimationDark","darkColor","PlayAnimationThormund","thormund","curve","THREE.CatmullRomCurve3","curve2","duration1","duration2","PlayAnimationImpact","planeImpact","SFX_MODE_CLASS","PlayAnimationOutline","outlinePass","selectedObjects","PlayConfettiStrength1","confetti","confettiStrength","shootConfettiProps","getShootConfettiProps","handleShootConfetti","PlayConfettiStrength2","med","PlayConfettiStrength3","PlaySoundCustom","getDialogContent","PlayMacro","macro","macros","macroId","execute","permissionLevel","CONST","DOCUMENT_PERMISSION_LEVELS","OBSERVER","ENTITY_PERMISSIONS","macroList","testUserPermission","SFX_MODE_LIST","SFX_CLASS","EXTRA_TRIGGER_TYPE","EXTRA_TRIGGER_RESULTS","renderQueue","garbageCollector","sfx","modules","active","specialEffectName","THREE.TextureLoader","sfxUniqueList","sfxList","specialEffect","sfxClassName","addSFXMode","initialized","playSFX","sfxInstance","renderSFX","queue","endSFX","_afterShow","clearQueue","RGBELoader","rgbe_error","rgbe_error_code","msg","fgets","lineLimit","consume","chunk","RGBEByteToRGBFloat","sourceOffset","destArray","destOffset","RGBEByteToRGBHalf","byteArray","rgbe_header_info","gamma_re","exposure_re","format_re","dimensions_re","comments","programtype","gamma","exposure","RGBE_ReadHeader","image_rgba_data","scanline_width","data_rgba","ptr_end","rgbeStart","scanline_buffer","num_scanlines","ptr","isEncodedRun","byteValue","off","RGBE_ReadPixels_RLE","numElements","floatArray","halfArray","setDataType","onLoadCallback","CopyShader","tDiffuse","Pass","isPass","needsSwap","renderToScreen","_camera","FullscreenTriangleGeometry","FullScreenQuad","ShaderPass","textureID","fsQuad","writeBuffer","readBuffer","MaskPass","writeValue","clearValue","REPLACE","ClearMaskPass","EffectComposer","renderTarget1","renderTarget2","passes","copyPass","swapBuffers","addPass","pass","insertPass","removePass","isLastEnabledPass","passIndex","maskActive","effectiveWidth","effectiveHeight","RenderPass","_oldClearColor","oldAutoClear","oldClearAlpha","oldOverrideMaterial","OutlinePass","renderCamera","visibleEdgeColor","hiddenEdgeColor","edgeGlow","usePatternTexture","edgeThickness","edgeStrength","downSampleRatio","pulsePeriod","_visibilityCache","resx","resy","renderTargetMaskBuffer","prepareMaskMaterial","getPrepareMaskMaterial","replaceDepthToViewZ","renderTargetDepthBuffer","renderTargetMaskDownSampleBuffer","renderTargetBlurBuffer1","renderTargetBlurBuffer2","edgeDetectionMaterial","getEdgeDetectionMaterial","renderTargetEdgeBuffer1","renderTargetEdgeBuffer2","separableBlurMaterial1","getSeperableBlurMaterial","separableBlurMaterial2","overlayMaterial","getOverlayMaterial","copyShader","copyUniforms","materialCopy","tempPulseColor1","tempPulseColor2","textureMatrix","changeVisibilityOfSelectedObjects","bVisible","gatherSelectedMeshesCallBack","changeVisibilityOfNonSelectedObjects","selectedMeshes","VisibilityChangeCallBack","bFound","updateTextureMatrix","BlurDirectionX","BlurDirectionY","patternTexture","cameraNearFar","maskTexture","texSize","maxRadius","MAX_RADIUS","kernelRadius","edgeTexture1","edgeTexture2","SMAAEdgesShader","SMAA_THRESHOLD","SMAAWeightsShader","SMAA_MAX_SEARCH_STEPS","SMAA_AREATEX_MAX_DISTANCE","SMAA_AREATEX_PIXEL_SIZE","SMAA_AREATEX_SUBTEX_SIZE","tArea","tSearch","SMAABlendShader","tColor","SMAAPass","edgesRT","weightsRT","areaTextureImage","getAreaTexture","areaTexture","searchTextureImage","getSearchTexture","searchTexture","uniformsEdges","materialEdges","uniformsWeights","materialWeights","uniformsBlend","materialBlend","GammaCorrectionShader","LuminosityHighPassShader","luminosityThreshold","smoothWidth","defaultColor","defaultOpacity","TransparentUnrealBloomPass","renderTargetsHorizontal","renderTargetsVertical","nMips","renderTargetBright","renderTargetHorizonal","renderTargetVertical","highPassShader","highPassUniforms","materialHighPassFilter","separableBlurMaterials","kernelSizeArray","compositeMaterial","getCompositeMaterial","bloomTintColors","inputRenderTarget","KERNEL_RADIUS","SIGMA","NUM_MIPS","blurTexture1","blurTexture2","blurTexture3","blurTexture4","blurTexture5","dirtTexture","bloomStrength","bloomFactors","bloomRadius","DiceBox","element_container","dice_factory","known_types","speed","isVisible","last_time","allowInteractivity","THREE.Raycaster","blackColor","nbIterationsBetweenRolls","currentWidth","currentHeight","containerWidth","containerHeight","THREE.Vector2","startDrag","startDragTime","constraintDown","constraint","cameraHeight","medium","world_sim","World","dice_body_material","desk_body_material","barrier_body_material","sounds_table","sounds_dice","sounds_coins","lastSoundType","lastSoundStep","lastSound","iteration","barrier","light_amb","desk","pane","public_interface","diceList","deadDiceList","framerate","sounds","soundDelay","soundsSurface","animstate","throwingForce","immersiveDarkness","toneMappingExposureDefault","selector","animate","intersected","showExtraDice","spotlight","ground","rethrowFunctions","afterThrowFunctions","preloadSounds","resources","spritemap","playAudioSprite","selfVolume","gainNode","createGain","gain","sampleSource","createBufferSource","destination","currentTime","preloadPresets","soundsVolume","boxType","globalAnimationSpeed","THREE.Scene","dice3dRenderers","THREE.WebGLRenderer","devicePixelRatio","loadContextScopedTextures","setScene","gravity","broadphase","NaiveBroadphase","solver","iterations","allowSleep","contactMaterial","ContactMaterial","restitution","addContactMaterial","addBody","jointBody","addShape","collisionFilterGroup","collisionFilterMask","roughnessMap_fingerprint","roughnessMap_wood","roughnessMap_metal","roughnessMap_stone","THREE.PMREMGenerator","THREE.CubeTextureLoader","clientWidth","clientHeight","autoscale","THREE.PerspectiveCamera","maxwidth","intensity_amb","THREE.HemisphereLight","THREE.DirectionalLight","shadowplane","THREE.ShadowMaterial","canvasSize","bloomPass","bloomThreshold","gammaPass","composerTarget","THREE.WebGLRenderTarget","bloomComposer","blendingPass","THREE.ShaderMaterial","bloomTexture","finalComposer","AAPass","vectorRand","getVectors","notationVectors","dist","projector","velocity","velvec","swapDiceFace","forcedResult","rotIndex","rotationDegrees","eulerAngle","THREE.Euler","THREE.MathUtils","THREE.Quaternion","spawnDice","dicedata","vectordata","startAtIteration","stopped","specialEffects","sleepSpeedLimit","sleepTimeLimit","DYNAMIC","linearDamping","angularDamping","eventCollide","stepQuaternions","stepPositions","diceType","diceMaterial","secret","glowingInDarkness","darknessLevel","objectContainer","THREE.Group","world","stepnumber","currentSoundType","detectedCollides","surface","soundlist","throwFinished","worldType","minIterations","iterationsNeeded","sleepState","updateMassProperties","simulateThrow","rolling","bodies","animateThrow","getTime","time_diff","neededSteps","animatedDiceDetected","meshCannon","worldAsleep","rendererStats","handleSpecialEffectsInit","throws","removeTicker","start_throw","countNewDice","throwingForceModifier","maxDiceNumber","clearAll","rollDice","clearDice","animateSelector","hasEmissive","clearScene","fn","ticker","app","_head","_cancelIfNeeded","dsnConfig","showcase","selectordice","extraDiceTypes","die","proportion","columns","start_time","elapsed","angle_change","body2mesh","THREE.Object3D","currentMaterial","Shape","types","SPHERE","sphere_geometry","PARTICLE","particleGeo","particleMaterial","particleSize","PLANE","submesh","BOX","box_geometry","halfExtents","CONVEXPOLYHEDRON","geo","THREE.BufferGeometry","shapeOffsets","shapeOrientations","findRootObject","findShowcaseDie","findHoveredDie","hoveredDie","onMouseMove","ndc","onMouseDown","entity","stopPropagation","mouseInteractionManager","interactive","vsub","pivot","vmult","PointToPointConstraint","addConstraint","onMouseUp","removeConstraint","activate","promisesSFX","DiceNotation","rolls","userConfig","cnt","number","countExploded","localNbThrow","exploded","indexThrow","discarded","diceNumber","some","hidden","modifiers","addDie","fvttDie","isd10of100","dsnDie","resultLabel","d100Result","enableFlavorColorset","mergedRollCommands","command","manualResultTrigger","onResult","Accumulator","onEnd","_timeout","_delay","_onEnd","_items","addItem","item","clearTimeout","Utils","userSettings","setFlag","formatversion","ui","notifications","migrated","newSettings","DEFAULT_OPTIONS","insertKeys","insertValues","DEFAULT_APPEARANCE","unsetFlag","cfg","reduce","i18nCfg","fontList","auto","getAvailableFontChoices","groupedSetsList","set1","set2","preparedList","locCategory","predicate","saves","savesObject","saveObject","fromEntries","ThinFilmFresnelMap","filmThickness","refractiveIndexFilm","refractiveIndexBase","_filmThickness","_refractiveIndexFilm","_refractiveIndexBase","_size","_data","_updateData","updateSettings","_fresnelRefl","refractiveIndex1","refractiveIndex2","cos1","cos2","sin1Sqr","refrRatio","sqrRefrRatio","r_p","r_s","yFit_1931","zFit_1931","t3","phi12","phi21","phi23","R12","T12","R23","R_bi","T_tot","R_star","R_bi_sqr","R_12_star","R_star_t_tot","refrRatioSqr","refrRatioSqrBase","cosThetaI","cosThetaT","cosThetaT2","pathDiff","pathDiff2PI","totX","totY","totZ","waveLen","deltaPhase","cosPhiX","cosPhiY","DiceTour","Tour","querySelector","MutationObserver","mutations","observer","querySelectorAll","observe","childList","subtree","_preStep","waitForElement","currentStep","_postStep","stepIndex","hasNext","triggerReset","click","scrollIntoView","block","inline","DiceTourMain","title","canBeResumed","steps","$","addClass","Dice3D","quality","imageQuality","webGLVersion","defaultShowExtraDice","hideAfterRoll","timeBeforeHide","hideFX","canvasZIndex","showOthersSFX","rollingArea","contrastOf","userAppearance","sfxArray","SFX","other","GMSFX","APPEARANCE","addTexture","textureData","textureEntry","initColorSets","addSFXTrigger","actionLoadSave","board","exports","hiddenAnimationQueue","_buildCanvas","_initListeners","_buildDiceBox","_loadFonts","_startQueueHandler","_nextAnimationHandler","_welcomeMessage","_registerTours","canInteract","sidebarWidth","sidebarOffset","innerWidth","area","innerHeight","css","appendTo","after","ALL_CONFIG","_rtime","resize","_resizeEnd","on","ev","menus","currentTarget","dataset","tours","socket","request","show","_onMouseMove","_onMouseDown","_onMouseUp","_mouseNDC","_beforeShow","is","hide","resizeAndRebuild","setInterval","chatData","whisper","speaker","alias","flags","core","canPopout","ChatMessage","implementation","createDocuments","combatEnabled","combat","started","renderRolls","chatMessage","showMessage","_dice3danimating","chat","removeClass","sidebar","popouts","scrollBottom","popout","orderedDiceList","roll","diceTerm","rollOrder","rollList","plus","OperatorTerm","operator","termList","fromTerms","recursShowForRoll","showForRoll","synchronize","blind","messageID","actor","actors","messages","isContentVisible","hookedRoll","dsnRoll","ALL_CUSTOMIZATION","timestamp","_showAnimation","displayed","showExtraDiceByDefault","waitFor3DAnimationByMessageID","targetMessageId","buildHook","messageId","nextAnimation","timing","items","commands","mergeQueuedRollCommands","aThrow","timeoutHandle","fail","DiceConfig","FormApplication","defaultOptions","template","closeOnSubmit","tabs","navSelector","contentSelector","initial","fxList","speedList","textureList","prepareTextureList","materialList","prepareFontList","colorsetList","prepareColorsetList","imageQualityList","shadowQualityList","antialiasingList","smaa","msaa","systemList","prepareSystemList","soundsSurfaceList","felt","wood_table","wood_tray","canvasZIndexList","over","under","throwingForceList","weak","strong","ALL_DEFAULT_OPTIONS","navOrder","triggerTypeList","possibleResultList","termClass","option","specialEffectsList","specialEffectsPromises","registeredTriggerTypes","trigger","hdbsTemplate","Handlebars","renderTemplate","specialEffectsMode","html","tabsList","tabsAppearance","tabsPromises","navAppearance","displayHint","lastActiveAppearanceTab","initializationData","currentGlobalAppearance","sfxDialogList","templateSelect2","parentElement","sfxResultDicetype","select2Options","dropdownCssClass","escapeMarkup","dropdownParent","templateResult","templateSelection","activateListeners","append","toggleHideAfterRoll","toggleAutoScale","toggleCustomization","filterSystems","setPreferredOptions","select2dsn","onApply","toggleSounds","toggleCustomColors","onReset","closeAppearanceTab","getShowcaseAppearance","denominationList","Roll","getShowcaseSFX","customization","firstSFX","parents","each","sfxLineOptions","Dialog","buttons","ok","icon","default","detach","dialog","appId","optionHTML","frag","empty","prevAll","fp","onclick","_activateFilePicker","saveList","dialogSaveAs","actionSaveAs","actionDeleteSave","prop","classes","no","import","form","readTextFromFile","actionImportFromJSON","filename","actionExportToJSON","saveDataToFile","actionExportSFXToJSON","activateAppearanceTab","tabName","insertBefore","htmlNavString","submit","preventClose","preventRender","_tabs","triggerCallback","_onChangeTab","_contentSelector","appearanceArray","diffObject","checked","customizationElements","colorsetForce","indexOpt","elementOpt","parseInputs","retloop","part","formData","dataArr","currentSettings","setting","reload","_onSubmit","RollableAreaConfig","$diceBox","_onRestore","resizing","prevX","prevY","newX","newY","resizers","resizer","classList","saveSettingsAndRebuild","debouncedReload","debounce","registerMenu","hint","restricted","choices","onChange","Boolean","migrateOldSettings","updated","logger","hasInlineRoll","isRoll","messageHookDisabled","maxRollOrder","JqInlineRolls","parseHTML","inlineRollList","unescape","diceterm","PoolTerm","fromRolls","_countNewRolls","updateData","dsnCountAddedRoll","toObject","anim"],"mappings":"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OAAQ,CACJ,uDACA,uDACA,uDACA,wDAEJI,aAAc,CACV,uDACA,uDACA,uDACA,wDAEJhC,SAAU,SACVkD,SAAU,mBACVb,OAAQ,aAGZoF,EAAmB1D,KAAK,CACpBvC,KAAM,KACNI,OAAQ,CACJ,uDACA,uDACA,uDACA,uDACA,uDACA,wDAEJI,aAAc,CACV,uDACA,uDACA,uDACA,uDACA,uDACA,wDAEJhC,SAAU,SACVkD,SAAU,mBACVb,OAAQ,aAGZoF,EAAmB1D,KAAK,CACpBvC,KAAM,KACNI,OAAQ,CACJ,uDACA,uDACA,uDACA,uDACA,uDACA,uDACA,uDACA,wDAEJI,aAAc,CACV,uDACA,uDACA,uDACA,uDACA,uDACA,uDACA,uDACA,wDAEJhC,SAAU,SACVkD,SAAU,mBACVb,OAAQ,aAGZoF,EAAmB1D,KAAK,CACpBvC,KAAM,MACNI,OAAQ,CACJ,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,yDAEJI,aAAc,CACV,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,yDAEJhC,SAAU,SACVkD,SAAU,mBACVb,OAAQ,aAGZoF,EAAmB1D,KAAK,CACpBvC,KAAM,MACNI,OAAQ,CACJ,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,yDACA,yDACA,0DAEJI,aAAc,CACV,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,yDACA,yDACA,0DAEJhC,SAAU,SACVkD,SAAU,mBACVb,OAAQ,aAGZoF,EAAmB1D,KAAK,CACpBvC,KAAM,OACNI,OAAQ,CACJ,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,2DAEJI,aAAc,CACV,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,2DAEJhC,SAAU,SACVkD,SAAU,mBACVb,OAAQ,aAGZoF,EAAmB1D,KAAK,CACpBvC,KAAM,MACNI,OAAQ,CACJ,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wD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AoB,oBAAqB,sBAAuB,qBAAsB,mBAAoB,sBAAuB,qBAAsB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,sBAAwB,mBAAoB,oBAAqB,sBAAwB,mBAAoB,oBAAqB,sBAAwB,mBAAoB,kBAAmB,sBAAwB,oBAAqB,kBAAmB,sBAAwB,oBAAqB,oBAAqB,sBAAuB,mBAAoB,oBAAqB,sBAAuB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,qBAAsB,mBAAoB,oBAAqB,qBAAsB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,qBAAsB,kBAAmB,oBAAqB,qBAAsB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,qBAAsB,sBAAuB,kBAAmB,qBAAsB,sBAAuB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,qBAAuB,kBAAmB,oBAAqB,qBAAuB,kBAAmB,oBAAqB,qBAAuB,kBAAmB,mBAAoB,qBAAuB,kBAAmB,mBAAoB,qBAAuB,kBAAmB,sBAAuB,oBAAqB,kBAAmB,sBAAuB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,qBAAsB,oBAAqB,kBAAmB,qBAAsB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,sBAAuB,oBAAqB,mBAAoB,sBAAuB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,qBAAsB,oBAAqB,mBAAoB,qBAAsB,oBAAqB,mBAAoB,sBAAuB,oBAAqB,mBAAoB,sBAAuB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,qBAAsB,qBAAsB,kBAAmB,qBAAsB,qBAAsB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,qBAAsB,oBAAqB,mBAAoB,qBAAsB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,qBAAsB,oBAAqB,kBAAmB,qBAAsB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,qBAAsB,oBAAqB,kBAAmB,qBAAsB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,mBAAoB,qBAAsB,oBAAqB,kBAAmB,qBAAsB,oBAAqB,kBAAmB,oBAAqB,qBAAsB,kBAAmB,oBAAqB,qBAAsB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AAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,OACpsGC,YAAc,IAGlBI,MAAS,CACP1P,KAAQ,cACRqP,MAAS,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,EAAE,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,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,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE,GAAG,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,EAAE,EAAE,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,EAAE,EAAE,IAAI,IAAI,GAAG,EAAE,GAAG,IAE/+CM,eAAkB,CAChBC,OAAU,CAAC,EAAE,EAAE,GACfC,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,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBACtmLC,YAAc,GAEhBC,OAAU,CACRH,SAAY,EACZpP,KAAQ,eACRqP,MAAS,CAAC,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,qBAAuB,oBAAsB,mBAAqB,qBAAuB,oBAAsB,mBAAqB,qBAAuB,oBAAsB,mBAAqB,qBAAuB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,kBAAoB,qBAAuB,mBAAqB,oBAAsB,qBAAuB,mBAAqB,oBAAsB,qBAAuB,mBAAqB,oBAAsB,qBAAuB,mBAAqB,qBAAuB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,mBAAqB,mBAAqB,qBAAuB,oBAAsB,mBAAqB,qBAAuB,oBAAsB,mBAAqB,qBAAuB,oBAAsB,mBAAqB,qBAAuB,oBAAsB,qBAAuB,qBAAuB,kBAAoB,qBAAuB,qBAAuB,kBAAoB,qBAAuB,qBAAuB,kBAAoB,qBAAuB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,qBAAuB,mBAAqB,qBAAuB,qBAAuB,mBAAqB,qBAAuB,qBAAuB,mBAAqB,qBAAuB,qBAAuB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,qBAAuB,qBAAuB,oBAAsB,mBAAqB,qBAAuB,oBAAsB,mBAAqB,qBAAuB,oBAAsB,mBAAqB,qBAAuB,oBAAsB,mBAAqB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,oBAAsB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,qBAAuB,oBAAsB,kBAAoB,qBAAuB,oBAAsB,kBAAoB,qBAAuB,oBAAsB,kBAAoB,qBAAuB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAq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MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,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mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,iBAAmB,mBAAqB,kBAAoB,iBAAmB,mBAAqB,kBAAoB,iBAAmB,mBAAqB,kBAAoB,iBAAmB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,iBAAmB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBA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AAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,M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kB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,qBAAsB,kBAAkB,mBAAmB,qBAAsB,kBAAkB,mBAAmB,qBAAsB,kBAAkB,mBAAmB,qBAAsB,kBAAkB,oBAAoB,oBAAqB,kBAAkB,oBAAoB,oBAAqB,kBAAkB,oBAAoB,oBAAqB,kBAAkB,oBAAoB,oBAAqB,mBAAmB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,mBAAoB,mBAAmB,kBAAkB,mBAAoB,mBAAmB,kBAAkB,mBAAoB,mBAAmB,kBAAkB,mBAAoB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,mBAAmB,gBAAgB,oBAAoB,mBAAmB,gBAAgB,oBAAoB,mBAAmB,gBAAgB,oBAAoB,mBAAmB,gBAAgB,oBAAoB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,kBAAmB,mBAAmB,iBAAiB,kBAAmB,mBAAmB,iBAAiB,kBAAmB,mBAAmB,iBAAiB,kBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,oBAAoB,mBAAmB,oBAAqB,mBAAmB,mBAAmB,oBAAqB,mBAAmB,mBAAmB,oBAAqB,mBAAmB,mBAAmB,oBAAqB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAoB,mBAAmB,kBAAkB,mBAAoB,mBAAmB,kBAAkB,mBAAoB,mBAAmB,kBAAkB,mBAAoB,mBAAmB,kBAAkB,oBAAoB,qBAAsB,mBAAmB,oBAAoB,qBAAsB,mBAAmB,oBAAoB,qBAAsB,mBAAmB,oBAAoB,qBAAsB,mBAAmB,kBAAmB,oBAAoB,mBAAmB,kBAAmB,oBAAoB,mBAAmB,kBAAmB,oBAAoB,mBAAmB,kBAAmB,oBAAoB,mBAC51RC,YAAc,GAEhBC,OAAU,CACRH,SAAY,EACZpP,KAAQ,eACRqP,MAAS,EAAE,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,qBAAuB,kBAAmB,kBAAmB,qBAAuB,kBAAmB,kBAAmB,qBAAuB,kBAAmB,kBAAmB,qBAAuB,kBAAmB,kBAAmB,sBAAwB,kBAAmB,kBAAmB,sBAAwB,kBAAmB,kBAAmB,sBAAwB,kBAAmB,kBAAmB,sBAAwB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,qBAAsB,kBAAmB,kBAAmB,qBAAsB,kBAAmB,kBAAmB,qBAAsB,kBAAmB,kBAAmB,qBAAsB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,uBAAyB,mBAAoB,kBAAmB,uBAAyB,mBAAoB,kBAAmB,uBAAyB,mBAAoB,kBAAmB,uBAAyB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAC3wSC,YAAc,GAEhBE,GAAM,CACJJ,SAAY,EACZpP,KAAQ,eACRqP,MAAS,CAAC,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,qBAAsB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,iBAAkB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,qBAAsB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,iBAAkB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,sBACzsMC,YAAc,GAEhBG,MAAS,CACPL,SAAY,EACZpP,KAAQ,cACRqP,MAAS,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM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AoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,iBAAkB,oBAAqB,iBAAkB,iBAAkB,oBAAqB,iBAAkB,iBAAkB,oBAAqB,iBAAkB,iBAAkB,oBAAqB,gBAAiB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,oBAAsB,mBAAoB,mBAAoB,oBAAsB,mBAAoB,mBAAoB,oBAAsB,mBAAoB,mBAAoB,oBAAsB,mBAAoB,kBAAmB,kBAAmB,EAAG,iBAAkB,kBAAmB,EAAG,iBAAkB,kBAAmB,EAAG,iBAAkB,kBAAmB,EAAG,iBAAkB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,GAAI,kBAAmB,kBAAmB,GAAI,kBAAmB,kBAAmB,GAAI,kBAAmB,kBAAmB,GAAI,kBAAmB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,uBAAyB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,iBAAkB,oBAAsB,kBAAmB,kBAAmB,oBAAsB,kBAAmB,kBAAmB,oBAAsB,kBAAmB,kBAAmB,oBAAsB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,uBAAyB,kBAAmB,kBAAmB,uBAAyB,kBAAmB,kBAAmB,uBAAyB,kBAAmB,kBAAmB,uBAAyB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,uBAAyB,mBAAoB,kBAAmB,uBAAyB,mBAAoB,kBAAmB,uBAAyB,mBAAoB,kBAAmB,uBAAyB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,iBAAkB,kBAAmB,oBAAqB,iBAAkB,kBAAmB,oBAAqB,iBAAkB,kBAAmB,oBAAqB,iBAAkB,qBAAuB,mBAAoB,mBAAoB,qBAAuB,mBAAoB,mBAAoB,qBAAuB,mBAAoB,mBAAoB,qBAAuB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,oBAAqB,iBAAkB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,iBAAkB,oBAAqB,oBAAqB,iBAAkB,oBAAqB,oBAAqB,iBAAkB,oBAAqB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,sBAAwB,kBAAmB,mBAAoB,sBAAwB,kBAAmB,mBAAoB,sBAAwB,kBAAmB,mBAAoB,sBAAwB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,qBAAuB,kBAAmB,kBAAmB,qBAAuB,kBAAmB,kBAAmB,qBAAuB,kBAAmB,kBAAmB,qBAAuB,kBAAmB,mBAAoB,kBAAmB,GAAI,kBAAmB,kBAAmB,GAAI,kBAAmB,kBAAmB,GAAI,kBAAmB,kBAAmB,GAAI,kBAAmB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,gBAAiB,kBAAmB,mBAAoB,gBAAiB,kBAAmB,mBAAoB,gBAAiB,kBAAmB,mBAAoB,iBACjsbC,YAAc,GAEhBC,OAAU,CACRH,SAAY,EACZpP,KAAQ,eACRqP,MAAS,EAAE,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,qBAAwB,mBAAqB,mBAAqB,qBAAwB,mBAAqB,mBAAqB,qBAAwB,mBAAqB,mBAAqB,qBAAwB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,iBAAmB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,qBAAwB,kBAAoB,iBAAmB,qBAAwB,kBAAoB,iBAAmB,qBAAwB,kBAAoB,iBAAmB,qBAAwB,kBAAoB,gBAAkB,kBAAoB,sBAAyB,iBAAmB,kBAAoB,sBAAyB,iBAAmB,kBAAoB,sBAAyB,iBAAmB,kBAAoB,sBAAyB,iBAAmB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,sBAA0B,kBAAoB,mBAAqB,sBAA0B,kBAAoB,mBAAqB,sBAA0B,kBAAoB,mBAAqB,sBAA0B,kBAAoB,mBAAqB,mBAAqB,oBAAwB,mBAAqB,mBAAqB,oBAAwB,mBAAqB,mBAAqB,oBAAwB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,sBAAyB,kBAAoB,kBAAoB,sBAAyB,kBAAoB,kBAAoB,sBAAyB,kBAAoB,kBAAoB,sBAAyB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,kBAAoB,sBAA0B,kBAAoB,kBAAoB,sBAA0B,kBAAoB,kBAAoB,sBAA0B,kBAAoB,kBAAoB,sBAA0B,oBAAsB,iBAAmB,kBAAoB,oBAAsB,iBAAmB,kBAAoB,oBAAsB,iBAAmB,kBAAoB,oBAAsB,iBAAmB,iBAAmB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,kBAAoB,sBAAyB,mBAAqB,kBAAoB,sBAAyB,mBAAqB,kBAAoB,sBAAyB,mBAAqB,kBAAoB,sBAAyB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,iBAAmB,uBAA0B,mBAAqB,kBAAoB,uBAA0B,mBAAqB,kBAAoB,uBAA0B,mBAAqB,kBAAoB,uBAA0B,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,iBAAmB,mBAAqB,qBAAuB,iBAAmB,mBAAqB,qBAAuB,iBAAmB,mBAAqB,qBAAuB,iBAAmB,mBAAqB,qBAAuB,kBAAoB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,iBAAmB,kBAAoB,sBAA0B,iBAAmB,kBAAoB,sBAA0B,iBAAmB,kBAAoB,sBAA0B,iBAAmB,kBAAoB,sBAA0B,qBAAuB,iBAAmB,iBAAmB,qBAAuB,iBAAmB,iBAAmB,qBAAuB,iBAAmB,iBAAmB,qBAAuB,iBAAmB,iBAAmB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,sBAAyB,kBAAoB,mBAAqB,sBAAyB,kBAAoB,mBAAqB,sBAAyB,kBAAoB,mBAAqB,sBAAyB,kBAAoB,mBAAqB,kBAAoB,oBAAwB,mBAAqB,kBAAoB,oBAAwB,mBAAqB,kBAAoB,oBAAwB,mBAAqB,kBAAoB,oBAAwB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,mBACt3dC,YAAc,GAEhBE,GAAM,CACJJ,SAAY,EACZpP,KAAQ,eACRqP,MAAS,CAAC,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,gBAAkB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,gBAAkB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,gBAAkB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,qBAAuB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,oBAAsB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,iBAAmB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,iBAAmB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,iBAAmB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,oBAAsB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,iBAAmB,oBAAsB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBACjvTC,YAAc,GAEhBG,MAAS,CACPL,SAAY,EACZpP,KAAQ,cACRqP,MAAS,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OACnkNC,YAAc,IAGlBI,MAAS,CACP1P,KAAQ,cACRqP,MAAS,CAAC,GAAI,IAAK,IAAK,IAAK,EAAG,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,EAAG,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,EAAG,GAAI,GAAI,IAAK,IAAK,GAAI,EAAG,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,EAAG,IAAK,GAAI,GAAI,GAAI,IAAK,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,EAAG,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,EAAG,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IA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kB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,oBAAoB,iBAAiB,cAAc,oBAAoB,iBAAiB,cAAc,oBAAoB,iBAAiB,cAAc,oBAAoB,iBAAiB,cAAc,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,mBAAmB,mBAAoB,kBAAkB,kBAAkB,mBAAoB,kBAAkB,kBAAkB,mBAAoB,kBAAkB,kBAAkB,mBAAoB,kBAAkB,kBAAkB,mBAAoB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAmB,mBAAmB,kBAAkB,kBAAmB,mBAAmB,kBAAkB,kBAAmB,mBAAmB,kBAAkB,kBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,iBAAiB,oBAAqB,kBAAkB,iBAAiB,oBAAqB,kBAAkB,iBAAiB,oBAAqB,kBAAkB,iBAAiB,oBAAqB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,oBAAoB,mBAAoB,iBAAiB,mBAAmB,mBAAoB,iBAAiB,mBAAmB,mBAAoB,iBAAiB,mBAAmB,mBAAoB,iBAAiB,mBAAmB,mBAAoB,iBAAiB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,mBAAoB,kBAAkB,oBAAqB,mBAAoB,kBAAkB,oBAAqB,mBAAoB,kBAAkB,oBAAqB,mBAAoB,kBAAkB,oBAAqB,mBAAoB,kBAAkB,oBAAqB,mBAAoB,kBAAkB,oBAAqB,mBAAoB,kBAAkB,mBAAoB,kBAAmB,mBAAmB,kBAAmB,kBAAmB,mBAAmB,kBAAmB,kBAAmB,mBAAmB,kBAAmB,kBAAmB,mBAAmB,kBAAmB,kBAAmB,mBAAmB,kBAAmB,kBAAmB,mBAAmB,kBAAmB,kBAAmB,mBAAmB,mBACjwbC,YAAc,GAEhBC,OAAU,CACRH,SAAY,EACZpP,KAAQ,eACRqP,MAAS,EAAE,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,sBAAuB,mBAAoB,kBAAmB,sBAAuB,mBAAoB,kBAAmB,sBAAuB,mBAAoB,kBAAmB,sBAAuB,mBAAoB,kBAAmB,sBAAuB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,sBAAuB,mBAAoB,kBAAmB,sBAAuB,mBAAoB,kBAAmB,sBAAuB,mBAAoB,kBAAmB,sBAAuB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,qBAAsB,kBAAmB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,iBAAkB,oBAAqB,mBAAoB,iBAAkB,oBAAqB,mBAAoB,iBAAkB,oBAAqB,mBAAoB,iBAAkB,oBAAqB,gBAAiB,kBAAmB,oBAAqB,gBAAiB,kBAAmB,oBAAqB,gBAAiB,kBAAmB,oBAAqB,gBAAiB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,qBAAsB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,qBAAsB,EAAE,qBAAuB,qBAAsB,EAAE,qBAAuB,qBAAsB,EAAE,qBAAuB,qBAAsB,EAAE,qBAAuB,qBAAsB,EAAE,qBAAuB,qBAAsB,EAAE,qBAAuB,qBAAsB,EAAE,sBAAwB,uBAAwB,GAAG,sBAAwB,uBAAwB,GAAG,sBAAwB,uBAAwB,GAAG,sBAAwB,uBAAwB,GAAG,sBAAwB,uBAAwB,GAAG,sBAAwB,uBAAwB,GAAG,sBAAwB,uBAAwB,GAAG,sBACx5cC,YAAc,GAEhBE,GAAM,CACJJ,SAAY,EACZpP,KAAQ,eACRqP,MAAS,CAAC,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,iBAAkB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,iBAAkB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAC5wTC,YAAc,IAGlBI,MAAS,CACP1P,KAAQ,cACRqP,MAAS,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,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kB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,oBAAoB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,kBAAkB,qBAAuB,kBAAkB,qBAAqB,qBAAuB,kBAAkB,qBAAqB,qBAAuB,kBAAkB,qBAAqB,qBAAuB,kBAAkB,qBAAqB,qBAAuB,kBAAkB,qBAAqB,qBAAuB,kBAAkB,qBAAqB,qBAAuB,kBAAkB,qBAAqB,qBAAuB,kBAAkB,sBAAsB,sBAAyB,kBAAkB,sBAAsB,sBAAyB,kBAAkB,sBAAsB,sBAAyB,kBAAkB,sBAAsB,sBAAyB,kBAAkB,sBAAsB,sBAAyB,kBAAkB,sBAAsB,sBAAyB,kBAAkB,sBAAsB,sBAAyB,kBAAkB,sBAAsB,sBAAyB,kBAAkB,sBAC7ofC,YAAc,GAEhBC,OAAU,CACRH,SAAY,EACZpP,KAAQ,eACRqP,MAAS,CAAC,kBAAmB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,eAAgB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,gBAAiB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,iBAAkB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,eAAgB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,iBAAkB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,gBAAiB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,qBAAwB,GAAG,qBAAqB,qBAAwB,GAAG,qBAAqB,qBAAwB,GAAG,qBAAqB,qBAAwB,GAAG,qBAAqB,qBAAwB,GAAG,qBAAqB,qBAAwB,GAAG,qBAAqB,qBAAwB,GAAG,qBAAqB,qBAAwB,GAAG,sBAAsB,sBAAsB,GAAG,sBAAsB,sBAAsB,GAAG,sBAAsB,sBAAsB,GAAG,sBAAsB,sBAAsB,GAAG,sBAAsB,sBAAsB,GAAG,sBAAsB,sBAAsB,GAAG,sBAAsB,sBAAsB,GAAG,sBAAsB,sBAAsB,GAAG,sBACt+fC,YAAc,GAEhBE,GAAM,CACJJ,SAAY,EACZpP,KAAQ,eACRqP,MAAS,CAAC,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,qBAAsB,oBAAqB,qBAAsB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,qBAAsB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,qBAAsB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,qBAAsB,mBAAoB,qBAAsB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,qBAAsB,mBAAoB,mBAAoB,qBAAsB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,qBAAsB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,qBAAsB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,qBAAsB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,qBAAsB,mBAAoB,qBAAsB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,qBAAsB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,qBAAsB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,qBAAsB,kBAAmB,qBAAsB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,qBAAsB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,qBAAsB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAo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BAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,iBAAkB,oBAAqB,mBAAoB,iBAAkB,oBAAqB,mBAAoB,iBAAkB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,sBAAwB,oBAAqB,mBAAoB,sBAAwB,oBAAqB,mBAAoB,sBAAwB,oBAAqB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,EAAG,mBAAoB,kBAAmB,EAAG,mBAAoB,kBAAmB,EAAG,mBAAoB,kBAAmB,EAAG,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,uBAAyB,oBAAqB,kBAAmB,uBAAyB,oBAAqB,kBAAmB,uBAAyB,oBAAqB,kBAAmB,uBAAyB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,qBAAuB,oBAAqB,mBAAoB,qBAAuB,oBAAqB,mBAAoB,qBAAuB,oBAAqB,mBAAoB,qBAAuB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,EAAG,mBAAoB,kBAAmB,EAAG,mBAAoB,kBAAmB,EAAG,mBAAoB,kBAAmB,EAAG,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,GAAI,oBAAqB,kBAAmB,GAAI,oBAAqB,kBAAmB,GAAI,oBAAqB,kBAAmB,GAAI,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,GAAI,kBAAmB,kBAAmB,GAAI,kBAAmB,kBAAmB,GAAI,kBAAmB,kBAAmB,GAAI,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,sBAAwB,oBAAqB,mBAAoB,sBAAwB,oBAAqB,mBAAoB,sBAAwB,oBAAqB,mBAAoB,sBAAwB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,iBAAkB,sBAAwB,mBAAoB,kBAAmB,sBAAwB,mBAAoB,kBAAmB,sBAAwB,mBAAoB,kBAAmB,sBAAwB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,qBAAuB,mBAAoB,kBAAmB,qBAAuB,mBAAoB,kBAAmB,qBAAuB,mBAAoB,kBAAmB,qBAAuB,mBAAoB,mBAC/1bC,YAAc,GAEhBC,OAAU,CACRH,SAAY,EACZpP,KAAQ,eACRqP,MAAS,EAAE,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,sBAAuB,kBAAoB,mBAAqB,sBAAuB,kBAAoB,mBAAqB,sBAAuB,kBAAoB,mBAAqB,sBAAuB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,sBAA0B,mBAAqB,kBAAoB,sBAA0B,mBAAqB,kBAAoB,sBAA0B,mBAAqB,kBAAoB,sBAA0B,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,kBAAoB,oBAAsB,kBAAoB,gBAAkB,oBAAsB,kBAAoB,gBAAkB,oBAAsB,kBAAoB,gBAAkB,oBAAsB,kBAAoB,iBAAmB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,sBAA0B,iBAAmB,kBAAoB,sBAA0B,iBAAmB,kBAAoB,sBAA0B,iBAAmB,kBAAoB,sBAA0B,iBAAmB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,qBAAuB,iBAAmB,kBAAoB,qBAAuB,iBAAmB,kBAAoB,qBAAuB,iBAAmB,kBAAoB,qBAAuB,iBAAmB,kBAAoB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,iBAAmB,kBAAoB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,uBAA2B,mBAAqB,mBAAqB,uBAA2B,mBAAqB,mBAAqB,uBAA2B,mBAAqB,mBAAqB,uBAA2B,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,qBAAsB,kBAAoB,kBAAoB,qBAAsB,kBAAoB,kBAAoB,qBAAsB,kBAAoB,kBAAoB,qBAAsB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,iBAAmB,oBAAsB,mBAAqB,iBAAmB,oBAAsB,mBAAqB,iBAAmB,oBAAsB,mBAAqB,iBAAmB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,sBAA0B,kBAAoB,mBAAqB,sBAA0B,kBAAoB,mBAAqB,sBAA0B,kBAAoB,mBAAqB,sBAA0B,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,mBAAqB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,uBAA2B,mBAAqB,kBAAoB,uBAA2B,mBAAqB,kBAAoB,uBAA2B,mBAAqB,kBAAoB,uBAA2B,mBAAqB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,uBAA2B,kBAAoB,mBAAqB,uBAA2B,kBAAoB,mBAAqB,uBAA2B,kBAAoB,mBAAqB,uBAA2B,kBAAoB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,qBAAyB,kBAAoB,mBAAqB,qBAAyB,kBAAoB,mBAAqB,qBAAyB,kBAAoB,mBAAqB,qBAAyB,kBAAoB,oBACjydC,YAAc,GAEhBE,GAAM,CACJJ,SAAY,EACZpP,KAAQ,eACRqP,MAAS,CAAC,oBAAsB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,iBAAmB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,iBAAmB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,sBAAwB,kBAAoB,mBAAqB,mBAAqB,iBAAmB,qBAAuB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,kBAAoB,kBAAoB,oBAAuB,qBAAuB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,qBAAuB,mBAAqB,mBAAqB,mBAAqB,qBAAuB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,kBAAoB,iBAAmB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,oBAAsB,oBAAsB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,iBAAmB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,qBAAuB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,qBAAuB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,sBAAwB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,sBAAwB,mBAAqB,qBAAuB,kBAAoB,oBAAsB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,kBAAoB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,qBAAuB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,sBAAwB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,iBAAmB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,qBAAuB,oBAAsB,qBAAuB,iBAAmB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,qBAAuB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,iBAAmB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,iBAAmB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,qBAAuB,iBAAmB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,sBAAwB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,qBAAuB,iBAAmB,oBAAsB,oBAAsB,qBAAuB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,oBAAsB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,sBAAwB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,iBAAmB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,oBACjzTC,YAAc,GAEhBG,MAAS,CACPL,SAAY,EACZpP,KAAQ,cACRqP,MAAS,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OACnkN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AAoB,iBAAiB,mBAAmB,oBAAoB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,iBAAiB,iBAAiB,oBAAoB,iBAAiB,iBAAiB,oBAAoB,iBAAiB,iBAAiB,oBAAoB,iBAAiB,iBAAiB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,aAAa,mBAAmB,iBAAiB,aAAa,mBAAmB,iBAAiB,aAAa,mBAAmB,iBAAiB,aAAa,mBAAmB,iBAAiB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,kBAAkB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,iBAAiB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,kBAAkB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,iBAAiB,iBAAiB,mBAAmB,iBAAiB,iBAAiB,mBAAmB,iBAAiB,iBAAiB,mBAAmB,iBAAiB,iBAAiB,oBAAoB,iBAAiB,iBAAiB,oBAAoB,iBAAiB,iBAAiB,oBAAoB,iBAAiB,iBAAiB,oBAAoB,iBAAiB,iBAAiB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,iBAAiB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,iBAAiB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,iBAAiB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,iBAAiB,oBAAoB,kBAAkB,iBAAiB,oBAAoB,kBAAkB,iBAAiB,oBAAoB,kBAAkB,iBAAiB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,cAAc,mBAAmB,iBAAiB,cAAc,mBAAmB,iBAAiB,cAAc,mBAAmB,iBAAiB,cAAc,mBAAmB,kBAC73pBC,YAAc,GAEhBC,OAAU,CACRH,SAAY,EACZpP,KAAQ,eACRqP,MAAS,EAAE,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,gBAAiB,kBAAmB,oBAAqB,gBAAiB,kBAAmB,oBAAqB,gBAAiB,kBAAmB,oBAAqB,gBAAiB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,iBAAkB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAClusBC,YAAc,GAEhBE,GAAM,CACJJ,SAAY,EACZpP,KAAQ,eACRqP,MAAS,CAAC,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,qBAAsB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,iBAAkB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,iBAAkB,oBAAqB,iBAAkB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,qBAAsB,mBAAoB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,qBAAsB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,iBAAkB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAC17dC,YAAc,IAGlBI,MAAS,CACP1P,KAAQ,cACRqP,MAAS,CAAC,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,EAAE,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,G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AAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,sBAAsB,kBAAkB,mBAAmB,sBAAsB,kBAAkB,mBAAmB,sBAAsB,kBAAkB,mBAAmB,sBAAsB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,kBAAkB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,kBAAkB,kBAAkB,oBAAoB,sBAAuB,kBAAkB,oBAAoB,sBAAuB,kBAAkB,oBAAoB,sBAAuB,kBAAkB,oBAAoB,sBAAuB,qBAAsB,kBAAkB,kBAAkB,qBAAsB,kBAAkB,kBAAkB,qBAAsB,kBAAkB,kBAAkB,qBAAsB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,qBAAsB,mBAAmB,mBAAmB,qBAAsB,mBAAmB,mBAAmB,qBAAsB,mBAAmB,mBAAmB,qBAAsB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,mBAAmB,oBAAoB,qBAAqB,kBAAkB,oBAAoB,qBAAqB,kBAAkB,oBAAoB,qBAAqB,kBAAkB,oBAAoB,qBAAqB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,sBAAuB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,uBAAuB,mBAAmB,mBAAmB,uBAAuB,mBAAmB,mBAAmB,uBAAuB,mBAAmB,mBAAmB,uBAAuB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,iBAAiB,oBAAoB,kBAAkB,iBAAiB,oBAAoB,kBAAkB,iBAAiB,oBAAoB,kBAAkB,iBAAiB,oBAAoB,kBAAkB,iBAAiB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,oBAAoB,uBAAwB,mBAAmB,oBAAoB,uBAAwB,mBAAmB,oBAAoB,uBAAwB,mBAAmB,oBAAoB,uBAAwB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,sBAAuB,kBAAkB,mBAAmB,sBAAuB,kBAAkB,mBAAmB,sBAAuB,kBAAkB,mBAAmB,sBAAuB,kBAAkB,mBAAmB,sBAAuB,kBAAkB,mBAAmB,uBAAwB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,sBAAuB,kBAAkB,mBAAmB,sBAAuB,kBAAkB,mBAAmB,sBAAuB,kBAAkB,mBAAmB,sBAAuB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,qBAAsB,mBAAmB,oBAAoB,qBAAsB,mBAAmB,oBAAoB,qBAAsB,mBAAmB,oBAAoB,qBAAsB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,sBAAsB,iBAAiB,mBAAmB,sBAAsB,iBAAiB,mBAAmB,sBAAsB,iBAAiB,mBAAmB,sBAAsB,iBAAiB,mBAAmB,sBAAsB,iBAAiB,mBAAmB,sBAAsB,iBAAiB,mBAAmB,sBAAsB,iBAAiB,qBAAsB,kBAAkB,kBAAkB,qBAAsB,kBAAkB,kBAAkB,qBAAsB,kBAAkB,kBAAkB,qBAAsB,kBAAkB,kBAAkB,qBAAsB,kBAAkB,kBAAkB,qBAAsB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,oBAAoB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,uBAAwB,mBAAmB,kBAAkB,uBAAwB,mBAAmB,kBAAkB,uBAAwB,mBAAmB,kBAAkB,uBAAwB,mBAAmB,kBAAkB,uBAAwB,mBAAmB,kBAAkB,uBAAwB,mBAAmB,kBAAkB,uBAAwB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,sBAAsB,kBAAkB,kBAAkB,sBAAsB,kBAAkB,kBAAkB,sBAAsB,kBAAkB,kBAAkB,sBAAsB,kBAAkB,kBAAkB,sBAAsB,kBAAkB,kBAAkB,sBAAsB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,uBAAuB,mBAAmB,kBAAkB,uBAAuB,mBAAmB,kBAAkB,uBAAuB,mBAAmB,kBAAkB,uBAAuB,mBAAmB,kBAAkB,uBAAuB,mBAAmB,kBAAkB,uBAAuB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAA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,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,iBAAkB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,iBAAkB,oBAAqB,iBAAkB,kBAAmB,oBAAqB,kBAAmB,iBAAkB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mB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mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,iBAAkB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,oBAAqB,uBAAyB,mBAAoB,mBAAoB,sBAAyB,oBAAqB,iBAAkB,uBAA0B,mBAAoB,kBAAmB,uBAA0B,mBAAoB,kBAAmB,sBAAyB,oBAAqB,kBAAmB,uBAAyB,oBAAqB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,uBAA0B,kBAAmB,mBAAoB,uBAA0B,kBAAmB,oBAAqB,sBAAyB,kBAAmB,oBAAqB,uBAAyB,kBAAmB,qBAAsB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,qBAAsB,qBAAwB,mBAAoB,mBAAoB,oBAAsB,mBAAoB,qBAAsB,sBAAwB,mBAAoB,oBAAqB,sBAAyB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,sBAAsB,oBAAqB,mBAAoB,oBAAoB,oBAAqB,kBAAmB,qBAAwB,mBAAoB,iBAAkB,sBAAsB,oBAAqB,iBAAkB,uBAAyB,oBAAqB,mBAAoB,uBAAyB,oBAAqB,mBAAoB,sBAAwB,mBAAoB,oBAAuB,oBAAqB,kBAAmB,qBAAqB,mBAAoB,kBAAmB,qBAAwB,mBAAoB,kBAAmB,sBAAyB,mBAAoB,kBAAmB,qBAAuB,oBAAqB,kBAAmB,qBAAuB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,iBAAkB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,iBAAkB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,qBAAsB,kBAAmB,uBAAuB,qBAAsB,kBAAmB,sBAAsB,qBAAsB,kBAAmB,sBAAwB,qBAAsB,kBAAmB,uBAAyB,qBAAsB,iBAAkB,uBAAyB,oBAAqB,mBAAoB,sBAAsB,oBAAqB,kBAAmB,sBAAwB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,iB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,mBAAoB,mBAAoB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,iBAAkB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,MAAO,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,eAAgB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,MAAO,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,MAAO,mBAAoB,MAAO,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,eAAgB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,eAAgB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,iBAAkB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,iBAAkB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,MAAO,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,MAAO,kBAAmB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,eAAgB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,qBAAsB,kBAAmB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,eAAgB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,eAAgB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,iBAAkB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,MAAO,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,MAAO,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,qBAAsB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,MAAO,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,MAAO,kBAAmB,mBAAoB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,qBACjyxBC,YAAc,IAGlBI,MAAS,CACP1P,KAAQ,cACRqP,MAAS,CAAC,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAA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"}
|